在同一个CSV文件上进行读写

35

我正在尝试读取并在同一个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个回答

23

您应该使用不同的输出文件名称。即使您想要名称相同,也应该使用一些临时名称,最后再将文件重命名。

当您在“w”(或“wb”)模式下打开文件时,该文件将被“清除”-整个文件内容都会消失。Python文档中的open()函数说明如下:

... 'w' 仅用于写入(同名现有文件将被删除),...

因此,在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文件太大而无法在内存中处理,那么你需要将其写入不同的文件名,然后重命名。这可能会慢一些。


在打开文件时,你可以/应该使用上下文管理器,例如 with open("file.csv", "rb") - 这样你就不必记得调用 file1.close() - mecampbellsoup

4
如果您的CSV文件不够大(无法使内存爆炸),请将其全部读入内存,关闭文件,然后再以写模式打开它。或者您应该考虑写入一个新文件而不是同一个文件。

0

在Python中不可能以两种不同的模式打开同一个文件。您必须使用file_name.close()释放其中一个文件指针,然后才能以另一种模式打开该文件!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接