2016-09-26 132 views
0

試圖讓添加新行的方法波紋管的界面如下:Python3 - CSV - 添加行與namedtuple

def row_add(self, **rowtoadd) 

我不知道怎麼樣,如果我定義喜歡我列:

stuff1, stuff2, stuff3 

我可以得到一個** namedtuple按正確的列名稱順序排序。

到目前爲止,我已經試過(這裏表=我們正在編輯的文件路徑,包含我們需要的CSV):

def row_add(self, **rowtoadd): 
    if os.path.isfile(self.table): 
    with open(self.table, 'a') as csvfile: 
     csvwriter = csv.writer(csvfile) 
     csvwriter.writerow(rowtoadd) 

但namedtuple沒有轉化成一排,只有名字變量是。 例如:

row_add(stuff1="hello1", stuff2="hello2", stuff3="hello3") 
cat ./my_file.csv -> stuff1, stuff2, stuff3 

回答

1

嘗試以下操作:

csvwriter.writerow(rowtoadd[x] for x in sorted(rowtoadd.keys())) 

的問題是雙重的:

  1. 'rowtoadd' 是dict對象。一個字典的鍵的順序是不支持在Python中。
  2. 當你writerow(rowtoadd),在dict默認迭代器是關鍵,這就是爲什麼你的csv文件獲取鍵而不是值。

以我線的上面的代碼,sorted(rowtoadd.keys())排序字典的鍵,使得它們在可預知的順序(按字母順序)。 rowtoadd[x] for x in ...使它成爲一種理解,它提供了您想要打印到文件中的值的有序列表。

這裏要理解的一個關鍵是csvwriter不知道文件預先存在的結構。它不知道按鍵的順序。您需要以某種方式指定該順序。在這種情況下,我按字母順序指定了順序,但您可能需要以不同的方式執行。

如果您事先不知道字段的名稱,則可以使用位置參數來保持字段的順序。位置參數成爲tuple,這是蟒蛇有序類型:

def row_add(self, *row): 
    if os.path.isfile(self.table): 
    with open(self.table, 'a') as csvfile: 
     csvwriter = csv.writer(csvfile) 
     csvwriter.writerow(row) 

該解決方案依賴於調用者提供正確的順序參數的事實。