додати новий рядок до старого файлу файлу csv python


207

Я намагаюся додати новий рядок до свого старого файлу CSV. В основному, він оновлюється щоразу, коли запускаю сценарій Python.

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

Хотіли знати, чи є кращі способи цього зробити.

Відповіді:


246
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 ((соліст)), але в останньому рядку додається файл.
laspal

Метод передбачає, що додані елементи розділяються комами, що може бути не завжди. Тоді метод запису не підтримуватиме роздільник csv. Відповідь нижче є більш надійною в цьому сенсі.
sheth7

152

Я вважаю за краще це рішення, використовуючи 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'режимі (без b).

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'})

Я не пробував із звичайним письменником (без Дикта), але думаю, що це теж буде добре.


12

Ви відкриваєте файл у режимі "a" замість "w"?

Див. « Читання та запис файлів» у документах python

7.2. Читання та запис файлів

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

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

Перший аргумент - рядок, що містить ім'я файлу. Другий аргумент - це ще одна рядок, що містить кілька символів, що описують спосіб використання файлу. режим може бути "r", коли файл буде читатися лише "," лише для запису (існуючий файл з тим самим іменем буде стертий), а "a" відкриває файл для додавання; будь-які дані, записані у файл, автоматично додаються до кінця. 'r +' відкриває файл і для читання, і для запису. Аргумент режиму необов’язковий; "r" буде вважатись, якщо вона пропущена.

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


Ви можете зробити свою відповідь більш докладною, тоді це виглядатиме як справжня відповідь :-)
user702846

@user, я додав посилання - це вам допомагає?
Джон Ла Рой

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

2

Я цим способом додаю новий рядок у файл .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.