Python 使用r+;读取和写入同一文件的模式
我有一个脚本,它成功地从csv文件中删除了一列。目前,它通过创建一个新文件来实现这一点。我希望它写入原始文件,而不是创建新文件。 我已经尝试过用r+模式打开,但它不是我想要的工作方式。见下文注释。我认为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=
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)