2010-11-10 319 views
5

我正在使用Python的csv模塊來執行一些讀取和寫入csv文件。使用Python的CSV模塊覆蓋csv文件中的特定行

我已經讀得很好,追加到csv罰款,但我希望能夠覆蓋csv中的特定行。

供參考,這是我讀,然後寫代碼來追加:

#reading 
    b = open("bottles.csv", "rb") 
    bottles = csv.reader(b) 
    bottle_list = [] 
    bottle_list.extend(bottles) 
    b.close() 

    #appending 
    b=open('bottles.csv','a') 
    writer = csv.writer(b) 
    writer.writerow([bottle,emptyButtonCount,100, img]) 
    b.close() 

而且我使用基本相同的覆蓋模式(這是不正確的,它只是覆蓋了整個csv文件):

b=open('bottles.csv','wb') 
    writer = csv.writer(b) 
    writer.writerow([bottle,btlnum,100,img]) 
    b.close() 

在第二種情況下,我該如何告訴Python我需要一個特定的行被覆蓋?我搜索了Gogle和其他stackoverflow的帖子無濟於事。我認爲我有限的編程知識是責備而不是Google。

回答

11

我將增加Steven答:

import csv 

bottle_list = [] 

# Read all data from the csv file. 
with open('a.csv', 'rb') as b: 
    bottles = csv.reader(b) 
    bottle_list.extend(bottles) 

# data to override in the format {line_num_to_override:data_to_write}. 
line_to_override = {1:['e', 'c', 'd'] } 

# Write data to the csv file and replace the lines in the line_to_override dict. 
with open('a.csv', 'wb') as b: 
    writer = csv.writer(b) 
    for line, row in enumerate(bottle_list): 
     data = line_to_override.get(line, row) 
     writer.writerow(data) 
+0

謝謝!這完美的作品! – 2010-11-11 13:37:09

2

您無法覆蓋CSV文件中的單個行。您必須將所需的所有行寫入新文件,然後將其重命名爲原始文件名。

您的使用模式可能比CSV文件更適合數據庫。查看sqlite3模塊的輕量級數據庫。

+0

謝謝你的提示!我現在正在研究sqlite3文檔。如果我有更多數據可用,我可能會使用它。現在奇點的解決方案很好,因爲我的csv文件不是太大。 – 2010-11-11 13:39:09

相關問題