EDYCJA: Umieściłem go w tytule, ale po prostu zdałem sobie sprawę, że nie wspomniałem o tym w ciele. Wydaje się to być specyficzne dla systemu Windows.Pisanie pliku .CSV w języku Python, który działa zarówno w języku Python 2.7+, jak iw języku Python 3.3+ w systemie Windows
Mam trudności z zapisaniem danych wyjściowych przy użyciu modułu Python csv
w skrypcie, który działa zarówno w języku Python 2.7, jak i 3.3.
pierwszej próbie, która działa zgodnie z oczekiwaniami w Pythonie 2.7:
with open('test.csv', 'wb') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
Jednak, gdy to samo jest prowadzony w Pythonie 3.3 skończyć z:
TypeError: 'str' does not support the buffer interface
Więc zmienić 'wb'
do 'wt'
i działa, ale teraz mam dodatkowy pusty wiersz co drugą linię w pliku.
Aby to naprawić, zmienić:
with open('test.csv', 'wt') as csv_file:
do:
with open('test.csv', 'wt', newline='') as csv_file:
Ale teraz, to łamie Python 2.7:
TypeError: 'newline' is an invalid keyword argument for this function
wiem, może po prostu zrobić coś takiego :
try:
with open('test.csv', 'wt', newline='') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
except TypeError:
with open('test.csv', 'wb') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
Jednak ma to kilka poważnie szkodliwych powielaczy.
Czy ktoś ma czystszy sposób robienia tego?
EDIT: Dane Test jest prosty i nie ma żadnych nowych linii lub cokolwiek:
items = [{'header1': 'value', 'header2': 'value2'},
{'header1': 'blah1', 'header2': 'blah2'}]
Nie możesz po prostu użyć '' w'' zamiast '' wb'' lub ''wt''? – nathancahill
Czy ciągi znaków w łańcuchach 'items' listują' unicode', gdy uruchamiasz skrypt w Pythonie 2? Czy wartości są zawsze ASCII, czy mogą zawierać dodatkowe znaki, które muszą być zakodowane? Nawet jeśli możesz uruchomić ten sam kod w obu wersjach Pythona, możesz nie uzyskać takich samych wyników! – Blckknght
@Blckknght - Dodałem dane testowe do dolnej części pytania. To tylko tekst ASCII. – Tamerz