2010-06-30 302 views
16

我试图读取并在同一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我wa nt用Some new value替换它。 上面的代码给我空的CSV文件。

回答

13

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

当您以'w'(或'wb')模式打开文件时,该文件被“清除” - 整个文件内容消失。为open() Python的文件说:

...“w”表示只写(具有相同名称的现有文件将被删除),...

所以之前CSV功能启动文件被删除解析它。

3

如果您的csv文件不够大(以爆炸内存),请将它全部读入内存并关闭文件,然后再以写入模式打开它。

或者您应该考虑写入新文件而不是同一个文件。

6

您无法同时打开读取中的文件一次写入模式。

你的代码可以作如下修改: -

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

贾森指出,如果你的CSV是太大了你的记忆,那么你就需要写一个不同的文件名,然后将其重命名。这可能会慢一点。

0

无法在python中以两种不同的模式打开相同的文件。您必须在以另一种模式打开文件之前释放file_name.close()中的某个文件指针!