2013-08-05 39 views
-5

說我有兩個字典如何檢查CSV文件頭

dict1 = {'name':'Leo','age':'15','tel':'123456789'} 
dict2 = {'name':'Zac','age':'20','tel':'987654321'} 

我想這兩種類型的字典寫入csv文件。我可以寫一個dict到一個csv文件,頭文件位於表格頂部,但是當我將第二個dict添加到同一個csv文件時,它會在最後一次輸入後寫入另一個頭文件。所以我想知道如果有一種方法,以檢查是否標頭已經存在,如果沒有,添加標題,否則只需要添加新的字典數據

回答

0

確保

headers_that_do_not_exist = set(dict2.keys()) - set(dict1.keys()) 
+0

我不確切知道OP要求什麼,但它不可能是這樣。他的兩個詞有完全相同的鍵,所以這總是一個空集。另外,他正在嘗試將'dict2'寫入CSV文件,因此只需編寫新的頭文件(如果有的話)就不會起任何作用。 – abarnert

+0

是啊我假設你更接近OP想要的東西......我沒有很好地理解這個問題,我認爲... –

+0

我不確定那裏有足夠的理解這個問題......我假設他很多人會問 - 與CSV文件有關的東西,可能與'DictWriter'有關......但很難做到這一點。 – abarnert

2

目前尚不清楚你的問題是什麼,所以我將不得不猜測。如果你想要一個更具體的答案,而不是模糊的概括,你需要寫一個更具體的問題。

我懷疑你有一些像這樣的代碼:

with open('output.csv', 'w') as f: 
    dw = csv.DictWriter(f, ('name', 'age', 'tel')) 
    dw.writeheader() 
    dw.writerow(dict1) 

with open('output.csv', 'a') as f: 
    dw = csv.DictWriter(f, ('name', 'age', 'tel')) 
    dw.writeheader() 
    dw.writerow(dict2) 

而問題是,你的輸出是這樣的:

name,age,tel 
Leo,15,123456789 
name,age,tel 
Zac,20,987654321 

當你想這樣的:

name,age,tel 
Leo,15,123456789 
Zac,20,987654321 

如果是這樣,解決這個問題的正確方法是第二次不要撥打writeheader。根據您的代碼的結構,這可能非常簡單,只需在某處調用它即可。

但是,假設你有一些包裝函數,就像這樣:

def add_to_csv(row): 
    with open('output.csv', 'a') as f: 
     dw = csv.DictWriter(f, ('name', 'age', 'tel')) 
     dw.writeheader() 
     dw.writerow(row) 

而且你不能改變它,你想讓它只寫如果該文件是空的頭。

有幾種不同的方式來判斷文件是否爲空。考慮到你已經在'a'模式下打開文件,一個簡單的方法就是檢查f.tell()是否爲非零。或者你可以檢查os.fstat(f.fileno()).st_size是否爲非零。

但是,如果您在程序的一次運行中完成所有寫入操作,那麼在腳本中保持跟蹤可能更爲清晰。再次,您可以將openDictWriter代碼移出到實例/全局級別,而不是本地函數/方法。或者您可以添加一個實例/全局標誌,用於跟蹤您是否調用了writeheader