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

209

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

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

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

laspal
источник

Ответы:

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

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

inkedmn
источник
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 .

GM
источник
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), но я думаю, что это тоже будет хорошо.

Natacha
источник
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) 
markkaufman
источник
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")
Беньямин Джафари
источник