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

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)

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)

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


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.


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

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

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

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

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]]]
>>> 

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.