добавить новую строку в старый 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.