Редактирование файла CSV с помощью Python
Могу ли я изменить встроенный CSV-файл, используя библиотеку CSV Python или аналогичную технику?
Current Я обрабатываю файл и обновляю первый столбец (поле имени), чтобы изменить форматирование. Упрощенная версия моего кода выглядит так:
- Можно ли получить доступ к необработанным устройствам с помощью python с окнами?
- Запись файла с определенными разрешениями в Python
- Запись списка списков Python в файл csv
- Когда открыть файл в двоичном режиме (b)?
- Можно ли изменить строки в файле на месте?
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 Solutions collect form web for “Редактирование файла CSV с помощью Python”
Нет, вы не должны пытаться писать в файл, который вы сейчас читаете. Вы можете сделать это, если будете продолжать 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
чтобы облегчить задачу.
Не существует базового системного вызова для вставки данных в файл. Вы можете перезаписать, вы можете добавить, и вы можете заменить. Но вставка данных в середину означает чтение и переписывание всего файла с того момента, когда вы сделали свое редактирование до конца.
Таким образом, два способа сделать это: (a) удалить весь файл в память, внести изменения в него, а затем выгрузить результат на диск или (b) открыть временный выходной файл, в котором вы пишете свои результаты в то время как вы читаете входной файл, а затем заменяете старый файл новым, как только вы дойдете до конца. Один метод использует больше бара, а другой использует больше дискового пространства.
- Как получить доступ к значению ключа словаря, присутствующего в списке?
- Поиск скользящей средней из точек данных в Python