24

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

2 回答 2

62

不,您不应尝试写入当前正在读取的文件。如果您在读取一行后继续返回,则可以这样做,但这是不可取的,尤其是当您写回的数据多于读取的数据时。seek

规范的方法是写入一个新的临时文件,并将其移动到您从中读取的旧文件上。

from tempfile import NamedTemporaryFile
import shutil
import csv

filename = 'tmpEmployeeDatabase.csv'
tempfile = NamedTemporaryFile('w+t', newline='', delete=False)

with open(filename, 'r', newline='') 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库来简化任务。

于 2013-04-15T17:12:12.727 回答
7

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

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

于 2013-04-15T17:24:18.543 回答