在同一个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
,我想把它替换成 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 函数开始解析文件之前,文件就已经被删除了。