在同一个CSV文件中读写

35 投票
4 回答
64150 浏览
提问于 2025-04-16 00:36

我正在尝试在同一个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,我想把它替换成 Some new value。但是上面的代码让我得到了空的CSV文件。

4 个回答

4

如果你的csv文件不大(不会占用太多内存),可以把它全部读入内存,然后在以写入模式打开之前先关闭文件。

或者你可以考虑写入一个新文件,而不是直接覆盖原来的文件。

19

你不能同时以读取写入的方式打开一个文件。

你的代码可以这样修改:

# 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()

正如Jason所说,如果你的CSV文件太大,超出了你的内存,那么你需要写入一个不同的文件名,然后再把它重命名。这可能会稍微慢一些。

23

你应该使用不同的输出文件名。即使你想用相同的名字,也应该先用一个临时名字,最后再把文件重命名。

当你以 'w'(或 'wb')模式打开文件时,这个文件会被“清空”——也就是说,文件里的所有内容都会消失。Python 的文档中对 open() 的说明是:

... 'w' 只用于写入(如果有同名的文件,会被删除),...

所以在你的 csv 函数开始解析文件之前,文件就已经被删除了。

撰写回答