使用Python的CSV模块覆盖CSV文件中的特定行

11 投票
2 回答
40017 浏览
提问于 2025-04-16 06:52

我正在使用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我需要覆盖特定的行呢?我在Google和其他StackOverflow帖子上找了很多信息,但都没找到答案。我想我的编程知识有限可能是原因,而不是Google的问题。

2 个回答

5

你不能直接在CSV文件中覆盖一行数据。你需要把所有想要保留的行写入一个新文件,然后再把这个新文件改名为原来的文件名。

你的使用方式可能更适合用数据库,而不是CSV文件。可以考虑使用sqlite3模块,它是一个轻量级的数据库。

21

我想补充一下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)

撰写回答