2011-08-26 16 views
38

Próbuję użyć Python 3.2 na komputerze z systemem Windows, aby napisać prosty plik CSV, ale nie mam szczęścia. Z csv module documentation for Python 3.2:Python3: pisanie plików CSV

>>> import csv 
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ', 
...       quotechar='|', quoting=csv.QUOTE_MINIMAL) 
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 

produkuje plik z każdej linii rozwiązana przez sekwencję bajtów \r\r\n, więc wygląda na to każda linia ma dodatkowy pusty wiersz po otwarciu go, na przykład MS Excel. To nie jest "plik CSV".

Uwaga, jeśli staram się same example for Python 2.7 w Pythonie 3.2 (gdzie duża różnica jest 'w' vs 'wb' dla trybu pliku), pojawia się błąd przy próbie spamWriter.writerow:

Traceback (most recent call last): File "", line 1, in TypeError: 'str' does not support the buffer interface

Jak mogę napisać prosty plik CSV z Python 3.2 na komputerze z systemem Windows?

+3

problem wydaje się być Windows specyficznych . Działa dobrze na Linuksie. – phihag

Odpowiedz

53

Dokumentacja mówi, że należy użyć open('eggs.csv', 'w', newline='')

http://docs.python.org/py3k/library/csv.html#id2

+2

Ach, wygląda na to, że podniosłem nieco starszą wersję (-0.1) dokumentacji (por. [3.2] (http: // docs.python.org/release/3.2/library/csv.html#csv.writer) kontra [3.2.1] (http://docs.python.org/release/3.2.1/library/csv.html#csv .writer)) –

1

Aby bezpośrednio odpowiedzieć na to pytanie, należy być w stanie użyć parametru lineterminator formatowania:

... więc modyfikację tej linii powinny działać (niesprawdzone):

>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ', 
...       quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') 

Jak na przykład, dlaczego nie działa po wyjęciu z pudełka, dla mnie wygląda jak błąd.

+0

To jest jedyna odpowiedź, która sprawdziła się u mnie.Pięć lat później przykłady nadal nie działają po wyjęciu z pudełka :-( – Rup

5

Jak documented w footnote:

csv.writer(csvfile, dialect='excel', **fmtparams)

If csvfile is a file object, it should be opened with newline=''.

If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='', since the csv module does its own (universal) newline handling.

Poniższy wariant działa na Linux i Windows:

spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|', 
         quoting=csv.QUOTE_MINIMAL, newline='') 
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 
+4

Otrzymuję 'TypeError: 'newline' jest nieprawidłowym argumentem słowa kluczowego dla tej funkcji' kiedy próbuje to zrobić w py34. –

17

This będzie pracować zarówno Python 2 i Python 3:

if sys.version_info >= (3,0,0): 
    f = open(filename, 'w', newline='') 
else: 
    f = open(filename, 'wb') 
1

[dla Pythona 2.x] Ta implementacja spamWriter pracuje dla mnie ...

with open('assignmentresults.csv', 'wb') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    spamwriter.writerow(["Hullo", "World"]) 
+1

To nie jest odpowiedź dla Pythona 3, który podnosi" TypeError: 'str' ma nie obsługuje interfejsu bufora " –

1

postanowiłem ten błąd jak ja ruszał jeden z moich kodów z Python2.6.6 do python3.4.3

Python2.6.6 (Próbuję zrobić zaciemniania na moim csvfile)

with open(os.path.join(path, name) , 'r') as mycsvfile: 
writer = csv.writer(open(newFilename, 'w')) 

Przede działa dobrze z python2.6.6 ale nie działa na python3.4.3 jak szykowałem jakieś błędy UTF-8 Unicode przy próbie uruchomienia pliku python3, więc zrobiłem poniżej zmienia Python3.4.4

import codecs 
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile: 
writer = csv.writer(open(newFilename, 'w')) 

to jest mój kod działa poprawnie teraz, w zasadzie python3 nie rozważa niektóre z Unicode i musimy użyć kodeków importowe, które sprawiają, że praca, nadzieję, że to pomaga ..