Добавить новую строку в старый файл csv python

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

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

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

Ответ 1

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

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

Ответ 2

Я предпочитаю это решение, используя модуль 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: требуется объект, похожий на байты, а не & # 39; str & # 39; в Python и CSV в Python 3.6. Добавление newline='', как предполагает Наташа, приведет к обратной несовместимости между Python 2 и 3.

Ответ 3

Основываясь на ответе @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), но я думаю, что это будет хорошо.

Ответ 4

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

Смотрите Чтение и запись файлов в документах python

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

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

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

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

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

Ответ 5

# 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) 

Ответ 6

Если файл существует и содержит данные, то можно сгенерировать 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)

Ответ 7

Я делаю так, чтобы добавить новую строку в 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")