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

Evi*_*key 20 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)
Run Code Online (Sandbox Code Playgroud)

哲学有效,但我很好奇我是否可以进行内联编辑,这样我就不会复制文件了.

我已尝试过以下操作,但这会将新记录追加到文件末尾而不是替换它们.

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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 51

不,您不应该尝试写入您当前正在阅读的文件.如果你在阅读一行后继续阅读,你可以这样做,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)
Run Code Online (Sandbox Code Playgroud)

我在这里使用了tempfileshutil库来使任务更容易.

  • @PirateApp 不,这并不过分。我们正在从临时目录中移动一个文件来替换原来的文件。临时目录可能位于单独的文件系统上,因此简单的重命名可能会失败;在这种情况下,`shutil.move()` 将退回到复制和删除操作。 (2认同)

tyl*_*erl 5

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

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