在同一个csv文件上读写

时间:2010-06-30 04:56:07

标签: python 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文件。

5 个答案:

答案 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'):

>>> ['Hello']

>>> ['HelloHello']

我建议这样做:

def writing(file,'what to write'):  
    with open(file, "w") as wfile:
        break

def reading(file):
     with open(file, "r") as rfile:
        break