2013-03-27 93 views
3

在我的Python應用程序中,我將各種字段的值保存到一個文本文件中,並決定使用CSV格式,以便以可讀的方式在Excel中打開它。我也可以修改文件中的值並在應用程序中導入這些值。該文件中的格式如下:處理子類別的Python CSV文件

Category 1, Param 1, Param 2, Param 3, Param 4 
Command 1, 100, 123, 456, 1000 
Command 2, 980, 312, 567, 882 
Command 3, 0, 111, 584, 223 
Category 2, Param A, Param B, Param C 
Command A, 24, 14, 66 
Command B, 59, 0, 123 

保存CSV文件不是太大的問題,但我想知道是如何分離的類別,因爲我沒有的參數相同數量爲每一個。我一直在使用Python的csv模塊和DictReader方法,但它只是抓住一切,並將其放在同一個籃子中。所以,舉例來說,如果我用這個代碼:

def parseCsvFile(self, paramsfile): 
    with open(paramsfile, 'rb') as csvfile: 
     paramNames = ['Category', 'Param 1', 'Param 2', 'Param 3', 'Param 4'] 
     paramsReader = csv.DictReader(csvfile, fieldnames=paramNames) 
     for row in paramsReader: 
      print row['Category'] 

我會得到這樣的結果:

Category 1 
Command 1 
Command 2 
Command 3 
Category 2 
Command A 
Command B 

有沒有辦法在第一時間檢索第1類的數據,然後第2類與另一組字段名?

謝謝。

+0

不理解預期的輸出。請更新'Category 1'應該產生什麼 – 2013-03-27 13:40:50

+0

爲什麼不爲每個類別使用單個文件? – skndstry 2013-03-27 14:00:05

回答

2

我認爲真正的問題是,csv.DictReader真的不是爲這種文件設計的。特別是,它假定應該使用相同的字典來處理整個文件中的每一行。但是你正在改變中途的線路類型。相反,你應該只使用csv.reader

我猜你還是想把你的數據作爲字典來處理;在這種情況下,你只需要自己創建字典。我也猜測你想把數據作爲整數處理;如果不能用相關的東西替換下面的int。以下是我認爲你想要的:

def parseCsvFile(self, paramsfile) : 
    import csv 
    csvDict = {} 
    category = 'Unknown Category' 
    params = [] 
    with open(paramsfile, 'rb') as csvfile : 
     paramsReader = csv.reader(csvfile) 
     for row in paramsReader : 
      if row[0].startswith('Category') : 
       category = row[0] 
       csvDict[category] = {} 
       params = [p.strip() for p in row[1:] if p] 
      else : 
       csvDict[category][row[0]] = dict(zip(params, [int(p) for p in row[1:] if p])) 
    return csvDict 

返回的字典csvDict將是一個嵌套字典。文件的每個部分都將是字典中的一個鍵,相應的項目將是另一個字典,將該部分中的每一行保存爲字典。

+0

我只是由Excel導致的一個小問題,它在類別2行的末尾添加了空值。運行你的代碼的結果是:'ValueError:對於int()以10爲底的無效字面值:'''。但是,手動刪除CSV文件中的額外逗號使其按預期工作。非常感謝。 – jfmorin 2013-03-27 15:34:56

+0

很高興聽到它的工作!實際上也很容易讓它忽略來自Excel的額外列。我在代碼的倒數第二行添加了'if p',它完成了這項工作。 – Mike 2013-03-27 16:12:15