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

Python 使用r+;读取和写入同一文件的模式,python,file,csv,io,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=

我有一个脚本,它成功地从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]))

这会失败,因为错误
列表索引超出范围

,从我看到的情况来看,读者阅读,作者写作。在同一个文件上

文件有一个“光标”,即读取/写入文件的当前位置

因此,写入程序正在覆盖文件中读取器刚读过的那一行之后的下一行,这将对后续读取造成灾难性后果

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


从我所看到的,读者阅读,作者写作。文件有一个“光标”,即读取/写入文件的当前位置。因此,编写器将覆盖读取器刚刚读取的行之后的下一行。为什么不创建一个新文件,然后重命名它呢?谢谢Pynchia。我遇到一个错误,当文件存在时无法重命名,所以在os.rename(out_文件,in_文件)之前插入os.remove(in_文件),现在可以工作了。谢谢您的帮助。@bassmann:既然您使用的是
newline=''
,我猜您使用的是Python 3。如果是这种情况(并且您使用的是3.3或更高版本),那么您可以使用,它在Linux和Windows上具有一致的替换行为(在没有提示的情况下替换现有文件)。避免删除然后重命名所涉及的竞争条件。
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)