Menulis daftar daftar Python ke file csv

168

Saya memiliki daftar panjang daftar bentuk berikut ---

a = [[1.2,'abc',3],[1.2,'werew',4],........,[1.4,'qew',2]]

yaitu nilai-nilai dalam daftar adalah berbagai jenis - float, int, string. Bagaimana cara saya menulisnya ke file csv sehingga file csv output saya terlihat seperti

1.2,abc,3
1.2,werew,4
.
.
.
1.4,qew,2

sumber
2
Kemungkinan duplikat Simpan hasil ke file csv dengan Python
Martin Thoma

Jawaban:

299

Modul CSV bawaan Python dapat menangani ini dengan mudah:

import csv

with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(a)

Ini mengasumsikan daftar Anda didefinisikan sebagai a, seperti dalam pertanyaan Anda. Anda dapat mengubah format persis CSV keluaran melalui berbagai parameter opsional csv.writer()seperti yang didokumentasikan di halaman referensi perpustakaan yang ditautkan di atas.

Perbarui untuk Python 3

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)
Amber
sumber
88
Untuk kompatibilitas Python 3, hapus "b" dari "wb".
Vlad V
28
Dengan Python 3 - terbuka ('output.csv', 'w', newline = ''). Saya mendapatkan baris tambahan jika saya menghilangkan parameter baris baru. docs.python.org/3/library/csv.html#csv.writer
Spas
1
Dalam python3 saya harus menggunakan open ('output.csv', 'w', newline = "")
Tim Mottram
1
WOW bahwa kesalahan python 3 sangat tidak membantu. Terima kasih @vladV (objek seperti byte diperlukan, bukan 'str'). Agak masuk akal di belakang, tetapi tidak informatif di mana mencarinya.
Rambatino
1
@ tlalco itu mungkin berarti Anda menggunakan Python 2, dalam hal ini Anda harus menggunakan blok kode pertama daripada yang kedua. (Ini juga berarti Anda harus mempertimbangkan beralih ke Python 3.)
Amber
35

Anda bisa menggunakan pandas:

In [1]: import pandas as pd

In [2]: a = [[1.2,'abc',3],[1.2,'werew',4],[1.4,'qew',2]]

In [3]: my_df = pd.DataFrame(a)

In [4]: my_df.to_csv('my_csv.csv', index=False, header=False)
Akavall
sumber
Saya tidak berpikir harus menggunakan pandasjika perpustakaan built-in csvdapat melakukannya.
Simin Jie
6
Saya suka panda karena kuat
dorbodwolf
9
panda memang kuat, tentu, tapi aku tidak akan menggunakan McLaren untuk pergi ke toko sudut sebelah.
MI Wright
30
import csv
with open(file_path, 'a') as outcsv:   
    #configure writer to write standard csv file
    writer = csv.writer(outcsv, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerow(['number', 'text', 'number'])
    for item in list:
        #Write item to outcsv
        writer.writerow([item[0], item[1], item[2]])

dokumen resmi: http://docs.python.org/2/library/csv.html

Dmitry Zagorulkin
sumber
1
Ini akan mendapatkan +1 saya jika Anda bisa menjelaskan jawaban Anda dengan beberapa komentar.
Burhan Khalid
3
writerowtidak mengambil banyak argumen.
Amber
1
>>> w.writerow ("a", "b", "c") Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, dalam <module> TypeError: writerow () mengambil tepat satu argumen (3 diberikan)
Amber
@Amber versi python apa yang Anda gunakan?
Dmitry Zagorulkin
4
@ Ampun permisi. saya ketinggalan []
Dmitry Zagorulkin
11

Jika untuk alasan apapun Anda ingin melakukannya secara manual (tanpa menggunakan modul seperti csv, pandas, numpydll):

with open('myfile.csv','w') as f:
    for sublist in mylist:
        for item in sublist:
            f.write(item + ',')
        f.write('\n')

Tentu saja, memutar versi Anda sendiri bisa menjadi rawan kesalahan dan tidak efisien ... itu sebabnya ada modul untuk itu. Namun terkadang menulis sendiri dapat membantu Anda memahami cara kerjanya, dan terkadang lebih mudah.

mulai
sumber
11

Menggunakan csv.writer dalam daftar saya yang sangat besar membutuhkan waktu cukup lama. Saya memutuskan untuk menggunakan panda, lebih cepat dan lebih mudah untuk mengontrol dan memahami:

 import pandas

 yourlist = [[...],...,[...]]
 pd = pandas.DataFrame(yourlist)
 pd.to_csv("mylist.csv")

Bagian baiknya Anda dapat mengubah sesuatu untuk membuat file csv yang lebih baik:

 yourlist = [[...],...,[...]]
 columns = ["abcd","bcde","cdef"] #a csv with 3 columns
 index = [i[0] for i in yourlist] #first element of every list in yourlist
 not_index_list = [i[1:] for i in yourlist]
 pd = pandas.DataFrame(not_index_list, columns = columns, index = index)

 #Now you have a csv with columns and index:
 pd.to_csv("mylist.csv")
Dinidiniz
sumber
5

Solusi Ambers juga bekerja dengan baik untuk array numpy:

from pylab import *
import csv

array_=arange(0,10,1)
list_=[array_,array_*2,array_*3]
with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(list_)
Semjon Mössinger
sumber
4

Jika Anda tidak ingin mengimpor csvmodul untuk itu, Anda dapat menulis daftar daftar ke file csv hanya menggunakan Python built-in

with open("output.csv", "w") as f:
    for row in a:
        f.write("%s\n" % ','.join(str(col) for col in row))
yellow01
sumber
3

Pastikan untuk menunjukkan lineterinator='\n'kapan membuat penulis; jika tidak, baris kosong tambahan dapat ditulis ke dalam file setelah setiap baris data ketika sumber data berasal dari file csv lainnya ...

Ini solusinya:

with open('csvfile', 'a') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter='    ',quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
for i in range(0, len(data)):
    spamwriter.writerow(data[i])
yashi wang
sumber
3

Bagaimana kalau membuang daftar ke acar dan mengembalikannya dengan modul acar ? Cukup nyaman.

>>> import pickle
>>> 
>>> mylist = [1, 'foo', 'bar', {1, 2, 3}, [ [1,4,2,6], [3,6,0,10]]]
>>> with open('mylist', 'wb') as f:
...     pickle.dump(mylist, f) 


>>> with open('mylist', 'rb') as f:
...      mylist = pickle.load(f)
>>> mylist
[1, 'foo', 'bar', {1, 2, 3}, [[1, 4, 2, 6], [3, 6, 0, 10]]]
>>> 
Niat Baik
sumber
0

Saya mendapat pesan kesalahan saat mengikuti contoh dengan parameter baris baru di fungsi csv.writer. Kode berikut ini berfungsi untuk saya.

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
Jie
sumber