Utwórz plik. csv z wartościami z listy Pythona

Próbuję stworzyć .plik csv z wartościami z listy Pythona. Kiedy wypisuję wartości z listy, wszystkie są unicode (?), tzn. wyglądają mniej więcej tak

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

Jeśli iteruję przez wartości z listy, tzn. for v in mylist: print v wydają się być zwykłym tekstem.

I mogę umieścić , pomiędzy każdym z print ','.join(mylist)

I mogę wypisać do pliku, czyli

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

Ale chcę wyjść do pliku CSV i mieć ograniczniki wokół wartości na liście np.

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

Nie mogę znaleźć łatwego sposobu na włączenie ograniczników do formatowania, np. próbowałem za pomocą instrukcji join. Jak mogę to zrobić?

Author: Austin Cummings, 2010-01-18

10 answers

import csv

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

Edit: to działa tylko z Pythonem 2.x.

Aby działało z Pythonem 3.x zastąp wb przez w (Zobacz to więc odpowiedz )

with open(..., 'wb', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
 173
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 15:34:03

Oto bezpieczna wersja Alexa Martelli:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
 81
Author: Cristian Garcia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 05:48:28

Najlepszą opcją jaką znalazłem było użycie savetxt z numpy Moduł :

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

W przypadku, gdy masz wiele list, które muszą być ułożone

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
 16
Author: tokenizer_fsj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 15:30:05

Użyj modułu Pythona csv do odczytu i zapisu plików rozdzielanych przecinkami lub tabulatorami. Moduł csv jest preferowany, ponieważ daje dobrą kontrolę nad cytowaniem.

Na przykład, oto przykład pracy dla Ciebie:

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)

Produkuje:

"value 1","value 2","value 3"
 12
Author: vy32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 05:53:30

Dla innego podejścia, można użyć DataFrame w pandy : I może łatwo zrzucić dane do pliku csv, tak jak poniższy kod:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
 10
Author: Qy Zuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 08:33:44

Możesz użyć sznurka.metoda join w tym przypadku.

Podziel się na kilka linijek dla jasności-oto interaktywna Sesja

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

Lub jako pojedyncza linia

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

Jednak możesz mieć problem, ponieważ twoje ciągi mają osadzone cudzysłowy. Jeśli tak jest, musisz zdecydować, jak im uciec.

Moduł CSV może zająć się tym wszystkim za Ciebie, umożliwiając wybór pomiędzy różnymi opcjami cytowania (wszystkie pola, tylko pola z cudzysłowy i seperatory, tylko pola nieliczbowe, itp.) oraz jak esacpe kontrolować znaki (podwójne cudzysłowy lub łańcuchy znaków). Jeśli twoje wartości są proste, string.join prawdopodobnie będzie OK, ale jeśli musisz zarządzać wieloma przypadkami brzegowymi, użyj dostępnego modułu.

 7
Author: Robert Christie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 05:50:42

Powinieneś użyć modułu CSV na pewno, ale są szanse, że musisz napisać unicode . Dla tych , którzy muszą napisać unicode, jest to klasa ze strony przykładowej, którą możesz użyć jako modułu util:

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
Author: kommradHomer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-19 13:41:33

Oto inne rozwiązanie, które nie wymaga modułu csv.

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

Przykład:

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

Jednakże, jeśli początkowa lista zawiera pewne", nie będą one zabezpieczone. Jeśli jest to wymagane, możliwe jest wywołanie funkcji, aby uciec od niej w ten sposób:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
 1
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 06:06:53

Jupyter notebook

Powiedzmy, że Twoja lista to A

Następnie możesz zakodować następującą reklamę, którą będziesz miał jako plik csv (tylko kolumny!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
 0
Author: rsc05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 11:58:05

To rozwiązanie brzmi szalenie, ale działa gładko jak miód]}

import csv

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

Plik jest zapisywany przez csvwriter, stąd właściwości csv są zachowywane tzn. rozdzielane przecinkami. Ogranicznik pomaga w głównej części, przenosząc elementy listy do następnego wiersza, za każdym razem.

 0
Author: Saurabh Adhikary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 10:12:43