Listelerin Python listesini bir csv dosyasına yazma


170

Aşağıdaki form listelerinin uzun bir listesi var ---

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

yani, listedeki değerler farklı türdedir - float, int, strings.Çıkış csv dosyamın nasıl görüneceği şekilde nasıl csv dosyasına yazarım?

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

Yanıtlar:


301

Python'un yerleşik CSV modülü bunu kolayca halledebilir:

import csv

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

Bu a, listenizin sorunuzda olduğu gibi tanımlandığını varsayar . Çıkış CSV'sinin tam biçimini, csv.writer()yukarıda bağlı olan kütüphane referans sayfasında belgelendiği gibi çeşitli isteğe bağlı parametreler aracılığıyla değiştirebilirsiniz .

Python 3 Güncellemesi

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)

88
Python 3 uyumluluğu için "b" yi "wb" den kaldırın.
Vlad V

28
Python 3 ile - açık ('output.csv', 'w', newline = ''). Newline parametresini atlarsam fazladan bir satır alırım. docs.python.org/3/library/csv.html#csv.writer
Kaplıcalar

1
Python3'te open ('output.csv', 'w', newline = "") kullanmak zorunda kaldım
Tim Mottram

1
Vay canına bu python 3 hatası çok yararsızdır. Teşekkürler @vladV (bayt benzeri bir nesne gereklidir, 'str' değil). Gezde mantıklı geliyor, ama nereye bakılacağı konusunda bilgilendirici değil.
Rambatino

1
@tlalco, muhtemelen Python 2 kullandığınız anlamına gelir, bu durumda ikinci kod yerine ikinci kod bloğunu kullanmanız gerekir. (Ayrıca Python 3'e geçmeyi düşünmeniz gerektiği anlamına gelir.)
Amber

35

Şunları kullanabilirsiniz 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)

pandasYerleşik kütüphane csvbunu yapabilirse kullanmam gerektiğini düşünmüyorum .
Simin Jie

6
pandaları seviyorum çünkü güçlü
dorbodwolf

9
Pandalar güçlü, elbette, ama yandaki köşe dükkanına gitmek için bir McLaren kullanmayacağım.
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]])

resmi dokümanlar: http://docs.python.org/2/library/csv.html


1
Cevabınızı bazı yorumlarla açıklayabilirseniz, bu benim + 1'imi alacaktı.
Burhan Khalid

3
writerowbirden fazla argüman almaz.
Amber

1
>>> w.writerow ("a", "b", "c") Geri izleme (en son çağrı son sırada): <module> TypeError: writerow () içindeki "<stdin>", satır 1 dosyasında tam bir bağımsız değişken var (3))
Amber

@Amber hangi python sürümünü kullanıyorsunuz?
Dmitry Zagorulkin

4
@ Amber, afedersiniz. Kaçırdım []
Dmitry Zagorulkin

11

Sebebi ne olursa olsun size (gibi bir modül kullanmadan elle yapmak istiyorsa csv, pandas, numpyvs.):

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

Tabii ki, kendi sürümünüzü yuvarlamak hataya eğilimli ve verimsiz olabilir ... genellikle bunun için bir modül vardır. Ancak bazen kendiniz yazmak, nasıl çalıştıklarını anlamanıza yardımcı olabilir ve bazen daha kolaydır.


11

Çok büyük listemde csv.writer kullanmak oldukça uzun sürdü. Pandaları kullanmaya karar verdim, kontrol etmek ve anlamak daha hızlı ve daha kolaydı:

 import pandas

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

Iyi bir parçası daha iyi bir csv dosyası yapmak için bazı şeyleri değiştirebilirsiniz:

 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

Ambers çözümü aynı zamanda numpy dizileri için de işe yarar:

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

Bunun csviçin modülü içe aktarmak istemiyorsanız , yalnızca Python yerleşiklerini kullanarak bir csv dosyasına liste listesi yazabilirsiniz

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

3

Belirttiğinizden emin olun lineterinator='\n'Yazarı oluştururken ; Aksi takdirde, veri kaynakları diğer csv dosyasından olduğunda her veri satırından sonra dosyaya fazladan boş bir satır yazılabilir ...

İşte benim çözümüm:

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

Listenin turşuya boşaltılması ve turşu modülü ile geri yüklenmesine ne dersiniz ? Oldukça uygun.

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

Csv.writer işlevinde bir newline parametresi ile örnekleri izlerken bir hata iletisi aldım . Aşağıdaki kod benim için çalıştı.

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.