Редактирование файла CSV с помощью Python

Могу ли я изменить встроенный CSV файл с использованием библиотеки Python CSV или аналогичной методики?

Current Я обрабатываю файл и обновляю первый столбец (поле имени), чтобы изменить форматирование. Упрощенная версия моего кода выглядит так:

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)

Ответ 1

Нет, вы не должны пытаться писать в файл, который вы сейчас читаете. Вы можете сделать это, если вы сохраните 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)

Я использовал tempfile и shutil, чтобы облегчить задачу.

Ответ 2

Не существует базового системного вызова для вставки данных в файл. Вы можете перезаписать, вы можете добавить, и вы можете заменить. Но вставка данных в середину означает чтение и переписывание всего файла с того момента, когда вы сделали свое редактирование до конца.

Таким образом, два способа сделать это: (a) удалить весь файл в память, внести изменения в него, а затем выгрузить результат на диск или (b) открыть временный выходной файл, в котором вы напишите ваши результаты во время чтения входного файла, а затем замените старый файл новым, как только вы дойдете до конца. Один из методов использует больше бара, другой использует больше дискового пространства.