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ć?
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)
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)
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)
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"
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)
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.
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)
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])
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()
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.
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