tambahkan baris baru ke file python file csv lama

208

Saya mencoba menambahkan baris baru ke file csv lama saya. Pada dasarnya, ini diperbarui setiap kali saya menjalankan skrip Python.

Saat ini saya menyimpan nilai baris csv lama dalam daftar dan kemudian menghapus file csv dan membuatnya lagi dengan nilai daftar baru.

Ingin tahu apakah ada cara yang lebih baik untuk melakukan ini.

laspal
sumber

Jawaban:

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

Membuka file dengan 'a'parameter memungkinkan Anda menambahkan ke akhir file alih-alih hanya menimpa konten yang ada. Coba itu.

inkedmn
sumber
2
Saya mencoba fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) tetapi hanya baris terakhir yang ditambahkan di mengajukan.
laspal
Metode ini mengasumsikan bahwa item yang ditambahkan dipisahkan dengan koma, yang mungkin tidak selalu demikian. Maka metode tulis tidak akan mempertahankan pembatas csv. Jawaban di bawah ini lebih kuat dalam arti itu.
sheth7
154

Saya lebih suka solusi ini menggunakan csvmodul dari perpustakaan standar danwith pernyataan untuk menghindari membiarkan file terbuka.

Poin kuncinya adalah menggunakan 'a'untuk menambahkan ketika Anda membuka file.

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

Jika Anda menggunakan Python 2.7, Anda mungkin mengalami baris baru yang berlebihan di Windows. Anda dapat mencoba untuk menghindari mereka menggunakan 'ab'bukan 'a'akan ini, bagaimanapun, menyebabkan Anda TypeError: objek seperti byte diperlukan, bukan 'str' di python dan CSV di Python 3.6. Menambahkan newline='', seperti yang Natacha sarankan, akan menyebabkan Anda tidak kompatibel antara Python 2 dan 3 .

GM
sumber
24

Berbasis di jawaban @GM dan memperhatikan peringatan @John La Rooy, saya bisa menambahkan baris baru membuka file dalam 'a'mode.

Bahkan di windows, untuk menghindari masalah baris baru, Anda harus mendeklarasikannya sebagai newline=''.

Sekarang Anda dapat membuka file dalam 'a'mode (tanpa 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'})

Saya tidak mencoba dengan penulis biasa (tanpa Dict), tetapi saya pikir itu akan baik-baik saja.

Natacha
sumber
12

Apakah Anda membuka file dengan mode 'a' bukannya 'w'?

Lihat Membaca dan Menulis File di python docs

7.2. Membaca dan Menulis File

open () mengembalikan objek file, dan paling umum digunakan dengan dua argumen: open (nama file, mode).

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

Argumen pertama adalah string yang berisi nama file. Argumen kedua adalah string lain yang berisi beberapa karakter yang menggambarkan cara file akan digunakan. mode dapat 'r' ketika file hanya akan dibaca, 'w' hanya untuk menulis (file yang ada dengan nama yang sama akan dihapus), dan 'a' membuka file untuk ditambahkan; setiap data yang ditulis ke file secara otomatis ditambahkan ke bagian akhir. 'r +' membuka file untuk membaca dan menulis. Argumen mode adalah opsional; 'r' akan diasumsikan jika dihilangkan.

Pada Windows, 'b' ditambahkan ke mode membuka file dalam mode biner, jadi ada juga mode seperti 'rb', 'wb', dan 'r + b'. Python pada Windows membuat perbedaan antara teks dan file biner; karakter end-of-line dalam file teks secara otomatis diubah sedikit ketika data dibaca atau ditulis. Modifikasi di belakang layar untuk file data ini baik untuk file teks ASCII, tetapi itu akan merusak data biner seperti itu dalam file JPEG atau EXE. Berhati-hatilah untuk menggunakan mode biner saat membaca dan menulis file seperti itu. Di Unix, tidak ada salahnya menambahkan 'b' ke mode, sehingga Anda dapat menggunakannya platform-independen untuk semua file biner.

John La Rooy
sumber
mungkin Anda bisa membuat jawaban Anda lebih rumit, maka itu akan terlihat seperti jawaban nyata :-)
user702846
@ pengguna, saya menambahkan tautan - apakah itu membantu Anda?
John La Rooy
7

Jika file ada dan berisi data, maka dimungkinkan untuk membuat fieldnameparameter untuk csv.DictWritersecara otomatis:

# 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)
Ron Kalian
sumber
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
sumber
1
Harap perbaiki indentasi Anda. Jawaban juga mendapat manfaat dari penjelasan - dan jawaban ini juga menarik lebih banyak suara.
Tn.
Ini adalah beberapa kode sederhana, ini membuka file untuk mode append, menulis header rec dan kemudian bekerja melalui rekaman video di aList.
markkaufman
3

Saya lakukan dengan cara ini untuk menambahkan baris baru dalam file .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")
Benyamin Jafari
sumber