2010-06-30 351 views
16

我試圖讀取並在同一CSV文件中寫入寫:閱讀並同csv文件

file1 = open(file.csv, 'rb') 
file2 = open(file.csv, 'wb') 
reader = csv.reader(file1) 
writer = csv.writer(file2) 
for row in reader: 
    if row[2] == 'Test': 
     writer.writerow(row[0], row[1], 'Somevalue') 

我的CSV文件:

  • val1,2323,Notest
  • val2, 2323,Test

所以基本上如果我的row[2]值是Test我wa nt用Some new value替換它。 上面的代碼給我空的CSV文件。

回答

13

您應該使用不同的輸出文件名。即使您希望名稱相同,您也應該使用一些臨時名稱,最後重命名文件。

當您以'w'(或'wb')模式打開文件時,該文件被「清除」 - 整個文件內容消失。爲open() Python的文件說:

...「w」表示只寫(具有相同名稱的現有文件將被刪除),...

所以之前CSV功能啓動文件被刪除解析它。

3

如果您的csv文件不夠大(以爆炸內存),請將它全部讀入內存並關閉文件,然後再以寫入模式打開它。

或者您應該考慮寫入新文件而不是同一個文件。

6

您無法同時打開讀取中的文件一次寫入模式。

你的代碼可以作如下修改: -

# Do the reading 
file1 = open(file.csv, 'rb') 
reader = csv.reader(file1) 
new_rows_list = [] 
for row in reader: 
    if row[2] == 'Test': 
     new_row = [row[0], row[1], 'Somevalue'] 
     new_rows_list.append(new_row) 
file1.close() # <---IMPORTANT 

# Do the writing 
file2 = open(file.csv, 'wb') 
writer = csv.writer(file2) 
writer.writerows(new_rows_list) 
file2.close() 

賈森指出,如果你的CSV是太大了你的記憶,那麼你就需要寫一個不同的文件名,然後將其重命名。這可能會慢一點。

0

無法在python中以兩種不同的模式打開相同的文件。您必須在以另一種模式打開文件之前釋放file_name.close()中的某個文件指針!