【问题标题】:read and write on same csv file读取和写入同一个 csv 文件
【发布时间】:2011-03-09 23:05:20
【问题描述】:

我正在尝试读取和写入同一个 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 文件。

【问题讨论】:

    标签: python csv


    【解决方案1】:

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

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

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

    因此,您的文件在 csv 函数开始解析之前已被删除。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您不能同时在读取写入模式下打开文件。

        您的代码可以修改如下:-

        # 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 对您的记忆来说太大,那么您需要写入一个不同的文件名,然后重命名它。这可能会慢一些。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多