Python listesindeki değerlerle bir .csv dosyası oluşturma


182

Python listesindeki değerlerle bir .csv dosyası oluşturmaya çalışıyorum. Listedeki değerleri yazdırdığımda hepsi unicode (?), Yani bunun gibi bir şey

[u'value 1', u'value 2', ...]

Listedeki değerler arasında yineleme yaparsam, yani for v in mylist: print vdüz metin gibi görünürler.

Ve ,her birinin arasına birprint ','.join(mylist)

Ve bir dosyaya çıktı verebilirim, yani

myfile = open(...)
print >>myfile, ','.join(mylist)

Ancak bir CSV çıktısı almak istiyorum ve listedeki değerler etrafında sınırlayıcılar var.

"value 1", "value 2", ... 

Sınırlayıcıları biçimlendirmeye dahil etmenin kolay bir yolunu bulamıyorum, örneğin joinifadeyi denedim . Bunu nasıl yapabilirim?


Herkese teşekkürler, sorumu çözmek için birkaç cevabın fikirlerini birleştirdim :) Şimdi [...] verilerini doğrudan bir dosyaya yazmak için csv modülünü kullanıyorum csv data = [...] myfile = open ( ..., 'wb') out = csv.writer (open ("myfile.csv", "w"), ayırıcı = ',', quoting = csv.QUOTE_ALL) out.writerow (veri) iyi çalışıyor, ben yapıyorum verilerim [] xlrd ve csv modülünü kullanarak bir e-tablodan bazı verileri yakalayarak doğru sınırlayıcıları olan bir dosyaya yazar :) all all
Fortilan

Daha yeni bir yaklaşım pandaları
Richard

Python 3.4 kullanıcıları, bu benim için en iyi şekilde çalıştı: stackoverflow.com/questions/25022677/…
Leigh

Yanıtlar:


254
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

Düzenleme: Bu yalnızca python 2.x ile çalışır.

O yerini 3.x piton ile çalışmasını sağlamak için wbbirlikte w( bu SO cevaba bakınız )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
csv2.x içindeki modülün unicodes ile düzgün bir şekilde ilgili olmadığını unutmayın ; bununla nasıl başa çıkılacağına ilişkin örnekler için modül belgelerine bakın. docs.python.org/library/csv.html
Ignacio Vazquez-Abrams

14
Ayrıca wr.writerows (liste)
tovmeod

4
Her bir öğe de bir listeyse, yazma satırları listedeki her öğeyi sütunlara ayırıyor gibi görünüyor. Bu tablo çıktıları için oldukça kullanışlıdır.
whatnick

6
Bu python 3.4 ile çalışmaz. Anlıyorum TypeError: 'str' does not support the buffer interface.
botchniaque

1
Python 2 için 'w'şu şekilde kullanın : stackoverflow.com/questions/34283178/…
banan3'14

106

İşte Alex Martelli'nin güvenli bir versiyonu:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
artı 1 kullanmak için with, bittiğinde dosyanın kapalı olduğundan emin olun
BoltzmannBrain

Bunu bir for döngüsü içinde kullanıyorsam, blok ile tüm for döngüsü altında iç içe mi? Yoksa sadece wr.writerow(my_list)döngü içinde olmak daha verimli olur mu?
crypdick

1
@crypdick kesinlikle tüm bloğu döngüye koymamalısınız. Dosyayı açın, ardından her satırı bir döngüde yazın. N satır yazmak için dosyayı n kez açmanıza gerek yoktur.
Greg Kaleka

Bir dosyaya dize nesneleri yazıyorsanız, TypeError'dan kaçınmak için dosyayı açarken 'wt' kullanmanızı öneririz: 'str' değil, bayt benzeri bir nesne gereklidir.
don_Gunner94

41

Başka bir yaklaşıma için, kullanabileceğiniz DataFrame içinde pandalar : Ve kolayca hemen altında kodu gibi csv veri dökümü:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
Anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Düzgün bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek eğitim değerini büyük ölçüde artıracak ve benzer, ancak aynı olmayan soruları olan gelecekteki okuyucular için daha yararlı hale getirecektir. Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
Toby Speight

5
Ayrıca bunun çalışması için listelerin aynı uzunlukta olması gerekir, aksi takdirde bir ValueError (pandas v 0.22.0)
cheevahagadog

32

Bulduğum en iyi seçenek savetxt, numpymodülden kullanmaktı :

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

İstiflenmesi gereken birden fazla listeniz olması durumunda

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

8
Bu, sayısal çalışma için iyidir, ancak listede dizeler içeriyorsa çalışmaz.
Ricardo Cruz

12

csvVirgül veya sekmeyle ayrılmış dosyaları okumak ve yazmak için python modülünü kullanın . Csv modülü tercih edilir, çünkü teklif üzerinde iyi kontrol sağlar.

Örneğin, işinize yarayan örnek:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

üretir:

"value 1","value 2","value 3"

4
Benim için boş bir dosya üretir
caspii

İlk çalıştırma boştur ve daha sonra onu silemezsiniz, çünkü daha sonra python'da açılır. İkinci çalıştırma (ya da daha kesin: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))veriyi doldurur open("myfile.csv","w")ya da yeni bir dosya olsun, verileri doldurur.Çıkış open("myfile2.csv","w")nesnesi çalışma üzerine kurulu dosya nesnesiyle ilgilenemiyormuş gibi görünür, ancak çıktı işlemini bir yapılacak iş olarak depolar. out nesnesi dosya nesnesini ilk çalıştırmada depolar, ancak yalnızca dosya nesnesi zaten mevcut olduğunda yazılır! Aşağıdaki doğru çözümü inceleyin @Saurabh Adhikary
Lorenz

7

Bu durumda string.join yöntemini kullanabilirsiniz.

Netlik için birkaç satır üzerinden bölün - burada etkileşimli bir oturum var

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Veya tek bir satır olarak

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

Ancak, dizeleriniz tırnak içine alınmış bir sorun olabilir. Bu durumda onlardan nasıl kaçacağınıza karar vermeniz gerekir.

CSV modülü ve nasıl esacpe kontrol charecters için (çift tırnak, ya da (sadece tırnak seperatörlerden, sadece sigara sayısal alanlar, vb ile alanları, her alanda) çeşitli alıntı seçenekler arasında seçim sağlayan, sizin için tüm bu bakabilirim kaçan dizeler). Değerleriniz basitse string.join muhtemelen iyi olacaktır, ancak çok sayıda kenar durumu yönetmek zorundaysanız, mevcut modülü kullanın.


3

Bu çözümler çılgınca geliyor, ancak bal gibi pürüzsüz çalışıyor

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

Dosya csvwriter tarafından yazıldığından csv özellikleri korunur, yani virgülle ayrılır. Sınırlayıcı, her seferinde liste öğelerini bir sonraki satıra taşıyarak ana bölümde yardımcı olur.


1
Çok küçük ve çok hızlı
Ian Samz

1
çalışır ve @ vy32 örneğini genişleterek iç içe geçmiş bir listeniz varsa:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Lorenz

kulağa gerçekten çılgınca geliyor mu? Bence kulağa hoş geliyor
Stephanie Owen

3

Bir csv dosyası oluşturmak ve yazmak için

Aşağıdaki örnek, bir csv dosyası oluşturmayı ve yazmayı gösterir. dinamik bir dosya yazarı yapmak için csv içe aktarma paketini içe aktarmamız , ardından dosya referansı ile dosyanın bir örneğini oluşturmanız gerekir Ex: - open ("D: \ sample.csv", "w", newline = "" ) dosya_ yazarı olarak

burada dosya belirtilen dosya dizini ile mevcut değilse, python belirtilen dizinde aynı dosyayı oluşturur ve "w" yazmayı temsil eder, bir dosyayı okumak istiyorsanız "w" yerine "r" yazın veya ekleyin mevcut dosyaya sonra "a" ya. newline = "" her satır oluşturduğunuzda fazladan boş bir satır kaldırdığını belirtir, böylece boş satırı ortadan kaldırmak için newline = "" kullanırız, fields = ["Names", "Age gibi listeyi kullanarak bazı alan adları (sütun adları) oluştururuz "," Class "] , ardından Sözlük yazıcısını kullanarak ve sütun adlarını atayarak burada writer = csv.DictWriter (file_writer, fieldnames = fields) gibi yazar örneğine uygulayın, csv'ye sütun adları yazmak için writer.writeheader () kullanıyoruz dosya yazma değerlerinin sözlük yöntemi kullanılarak geçirilmesi gerekirken, burada anahtar sütun adı ve değer ilgili anahtar değerinizdir

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

Jupyter dizüstü bilgisayar

Diyelim ki listeniz A

Daha sonra aşağıdaki reklamı csv dosyası olarak kodlayabilirsiniz (yalnızca sütunlar!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

CSV modülünü mutlaka kullanmalısınız, ancak şansınız unicode yazmanız gerekir. Unicode yazması gerekenler için bu, bir util modülü olarak kullanabileceğiniz örnek sayfadaki sınıftır:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

csvModül gerektirmeyen başka bir çözüm .

print ', '.join(['"'+i+'"' for i in myList])

Misal :

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

Ancak, ilk liste bazı "içeriyorsa, bunlar kaçmaz. Gerekirse, böyle bir işlevden kaçmak için bir işlevi çağırmak mümkündür:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
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.