使用r +模式读取和写入同一文件

时间:2016-01-09 23:01:22

标签: python file csv io

我有一个成功从csv文件中删除列的脚本。目前,它通过创建新文件来实现此目的。我希望它写入原始文件而不是创建一个新文件。 我已经尝试过使用r +模式进行打开,但它并不是我想要的。见下面的注释。我认为r +模式是我需要的模式,但我很难找到可以学习的实例。

我的代码:

    import csv

    in_file = "Path to Source"
    out_file = "Path to Result"

    with open(in_file, 'r', newline='') as inf, \
        open(out_file, 'w', newline='') as outf:
     reader = csv.reader(inf)
     writer = csv.writer(outf)

     for r in reader:
         writer.writerow((r[0],r[1],r[2],r[3],r[4],r[5],r[6]))

尝试使用r+模式:

with open(in_file, 'r+', newline='') as inf:
    reader = csv.reader(inf)
    writer = csv.writer(inf)

    for r in reader:
        writer.writerow((r[0],r[1],r[2],r[3],r[4],r[5],r[6]))

此操作失败,错误为list index out of range

1 个答案:

答案 0 :(得分:2)

从我看到的,正如读者所读,作者写道。在同一个文件上。

文件有一个'光标',即读取/写入它们的当前位置。

因此,在读者读完文件之后,作者将覆盖文件中的下一行,并对以下读数造成灾难性后果。

我认为第一种方法是最好的方法:创建一个新文件然后重命名(原始输入文件会自动删除)

import csv, os
in_file = "Path to Source"
out_file = "Path to Result"

with open(in_file, 'r', newline='') as inf, \
     open(out_file, 'w', newline='') as outf:
    reader = csv.reader(inf)
    writer = csv.writer(outf)
    for r in reader:
        writer.writerow(r[:7])

os.rename(out_file, in_file)