我可以使用Python的CSV库或类似技术内联修改CSV文件吗?
当前我正在处理文件并更新第一列(名称字段)以更改格式。我的代码的简化版本如下所示:
with open('tmpEmployeeDatabase-out.csv', 'w') as csvOutput:
writer = csv.writer(csvOutput, delimiter=',', quotechar='"')
with open('tmpEmployeeDatabase.csv', 'r') as csvFile:
reader = csv.reader(csvFile, delimiter=',', quotechar='"')
for row in reader:
row[0] = row[0].title()
writer.writerow(row)
哲学有效,但我很好奇我是否可以进行内联编辑,这样我就不会复制文件了。
我已尝试过以下操作,但这会将新记录追加到文件的末尾而不是替换它们。
with open('tmpEmployeeDatabase.csv', 'r+') as csvFile:
reader = csv.reader(csvFile, delimiter=',', quotechar='"')
writer = csv.writer(csvFile, delimiter=',', quotechar='"')
for row in reader:
row[1] = row[1].title()
writer.writerow(row)
答案 0 :(得分:47)
不,您不应该尝试写入您当前正在阅读的文件。如果你在阅读一行后继续seek
但可以这样做,但这是不可取的,特别是如果你要写回的数据多于你读的数据。
规范方法是写入新的临时文件,并将其移到您读取的旧文件上。
from tempfile import NamedTemporaryFile
import shutil
import csv
filename = 'tmpEmployeeDatabase.csv'
tempfile = NamedTemporaryFile(delete=False)
with open(filename, 'rb') as csvFile, tempfile:
reader = csv.reader(csvFile, delimiter=',', quotechar='"')
writer = csv.writer(tempfile, delimiter=',', quotechar='"')
for row in reader:
row[1] = row[1].title()
writer.writerow(row)
shutil.move(tempfile.name, filename)
答案 1 :(得分:5)
没有基础系统调用将数据插入文件。您可以覆盖,可以追加,也可以替换。但是,将数据插入中间意味着从编辑到最后的那一点读取和重写整个文件。
因此,执行此操作的两种方法是(a)将整个文件放入内存,在那里进行编辑,然后将结果转储回磁盘,或者(b)打开一个临时输出文件在读取输入文件时写入结果,然后在结束时将旧文件替换为新文件。一种方法使用更多ram,另一种方法使用更多磁盘空间。