добавить новую строку в старый CSV-файл Python


209

Я пытаюсь добавить новую строку в мой старый CSV-файл. По сути, он обновляется каждый раз, когда я запускаю скрипт Python.

Прямо сейчас я сохраняю старые значения строк CSV в списке, а затем удаляю файл CSV и создаю его снова с новым значением списка.

Хотел узнать, есть ли лучшие способы сделать это.

Ответы:


248
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

Открытие файла с 'a'параметром позволяет добавить его в конец файла вместо простой перезаписи существующего содержимого. Попробуй это.


2
Я попытался fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)), но в последнюю добавляется только последняя строка файл.
— Laspal

Метод предполагает, что добавляемые элементы разделяются запятыми, что не всегда может иметь место. Тогда метод write не будет поддерживать разделитель csv. Ответ ниже является более надежным в этом смысле.
— sheth7

154

Я предпочитаю это решение, используя csvмодуль из стандартной библиотеки и withоператор, чтобы не оставлять файл открытым.

Ключевой момент используется 'a'для добавления при открытии файла.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

Если вы используете Python 2.7, у вас могут появиться лишние новые строки в Windows. Однако вы можете попытаться избежать их использования, 'ab'вместо этого 'a'это приведет к возникновению ошибки TypeError: требуется байтоподобный объект, а не 'str' в python и CSV в Python 3.6. Добавление newline='', как предполагает Наташа, приведет к обратной несовместимости между Python 2 и 3 .


24

Основываясь на ответе @GM и обращая внимание на предупреждение @John La Rooy, я смог добавить новую строку, открывая файл в 'a'режиме.

Даже в Windows, чтобы избежать проблемы перевода строки, вы должны объявить ее как newline=''.

Теперь вы можете открыть файл в 'a'режиме (без б).

import csv

with open(r'names.csv', 'a', newline='') as csvfile:
    fieldnames = ['This','aNew']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({'This':'is', 'aNew':'Row'})

Я не пытался с обычным писателем (без Dict), но я думаю, что это тоже будет хорошо.


12

Вы открываете файл с режимом «а» вместо «w»?

См. Чтение и запись файлов в документации по Python.

7.2. Чтение и запись файлов

open () возвращает объект файла и чаще всего используется с двумя аргументами: open (имя файла, режим).

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

Первый аргумент - это строка, содержащая имя файла. Второй аргумент - это другая строка, содержащая несколько символов, описывающих способ использования файла. режим может быть «r», когда файл будет только читаться, «w» только для записи (существующий файл с тем же именем будет удален), а «a» открывает файл для добавления; любые данные, записанные в файл, автоматически добавляются в конец. «r +» открывает файл для чтения и записи. Аргумент mode является необязательным; 'r' будет предполагаться, если оно опущено.

В Windows добавленный к режиму «b» открывает файл в двоичном режиме, поэтому существуют также режимы, такие как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных. Это закулисное изменение данных файла подходит для текстовых файлов ASCII, но оно повредит двоичные данные, подобные этим в файлах JPEG или EXE. Будьте очень осторожны, используя двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить 'b' в режим, так что вы можете использовать его независимо от платформы для всех двоичных файлов.


возможно, вы могли бы сделать свой ответ более детальным, тогда он выглядел бы как реальный ответ :-)
— user702846

@ Пользователь, я добавил ссылку - это тебе поможет?
— Джон Ла Рой

7

Если файл существует и содержит данные, то можно автоматически сгенерировать fieldnameпараметр для csv.DictWriter:

# read header automatically
with open(myFile, "r") as f:
    reader = csv.reader(f)
    for header in reader:
        break

# add row to CSV file
with open(myFile, "a", newline='') as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writerow(myDict)

6
# I like using the codecs opening in a with 
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
    logger = csv.DictWriter(logfile, fieldnames=field_names)
    logger.writeheader()

# some more code stuff 

    for video in aList:
        video_result = {}                                     
        video_result['date'] = video['snippet']['publishedAt']
        video_result['user'] = video['id']
        video_result['text'] = video['snippet']['description'].encode('utf8')
        logger.writerow(video_result) 

1
Пожалуйста, исправьте свой отступ. Ответы также выигрывают от объяснений - и эти ответы также привлекают больше голосов.
— Мистер Т

Это простой код, он открывает файл для режима добавления, записывает заголовок rec и затем обрабатывает видеозаписи в aList.
— markkaufman

3

Я иду по этому пути, чтобы добавить новую строку в файл .csv:

pose_x = 1 
pose_y = 2

with open('path-to-your-csv-file.csv', mode='a') as file_:
    file_.write("{},{}".format(pose_x, pose_y))
    file_.write("\n")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.