使用Python进行内联CSV文件编辑

时间:2013-04-15 17:08:16

标签: python csv file-io

我可以使用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)

2 个答案:

答案 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)

我在这里使用了tempfileshutil库来简化任务。

答案 1 :(得分:5)

没有基础系统调用数据插入文件。您可以覆盖,可以追加,也可以替换。但是,将数据插入中间意味着从编辑到最后的那一点读取和重写整个文件。

因此,执行此操作的两种方法是(a)将整个文件放入内存,在那里进行编辑,然后将结果转储回磁盘,或者(b)打开一个临时输出文件在读取输入文件时写入结果,然后在结束时将旧文件替换为新文件。一种方法使用更多ram,另一种方法使用更多磁盘空间。