我正在尝试读取和写入相同的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文件。
答案 0 :(得分:17)
您应该使用不同的输出文件名。即使您希望名称相同,也应使用一些临时名称,最后重命名文件。
当您以'w'(或'wb')模式打开文件时,此文件被“清除” - 整个文件内容消失。 open()
的Python文档说:
...'w'仅用于写入(将擦除具有相同名称的现有文件),...
因此,在csv函数开始解析之前,您的文件将被删除。
答案 1 :(得分:10)
您无法同时以读取和写入模式打开文件。
您的代码可以修改如下: -
# 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太大而无法记忆,那么您需要写入不同的文件名然后重命名。这可能会慢一些。
答案 2 :(得分:4)
如果您的csv文件不够大(爆炸内存),请将其全部读入内存并关闭文件,然后再以写入模式打开它。
或者你应该考虑写一个新文件而不是同一个文件。
答案 3 :(得分:-1)
在python中无法以两种不同的模式打开同一个文件。在以另一种模式打开文件之前,你必须用file_name.close()释放一个文件指针!
答案 4 :(得分:-1)
import csv
with open(file,"r+") as file:
break
注意:我发现“写入”受到影响,因为在添加下一个值之前未删除前一个值 值,看起来像这样(writing ='Hello'):
我建议这样做:
def writing(file,'what to write'):
with open(file, "w") as wfile:
break
def reading(file):
with open(file, "r") as rfile:
break