我有一个成功从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
答案 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)