EDIT: L'ho inserito nel titolo, ma ho appena realizzato che non l'ho menzionato nel corpo. Questo sembra essere specifico per Windows.Scrittura di un file .CSV in Python che funziona sia per Python 2.7+ che per Python 3.3+ in Windows
Ho difficoltà a scrivere l'output utilizzando il modulo Python csv
in uno script che funziona con Python 2.7 e 3.3.
Prima prova che funziona come previsto in Python 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)
Tuttavia, quando quella stessa cosa viene eseguito in Python 3.3 si finisce con:
TypeError: 'str' does not support the buffer interface
Così posso cambiare 'wb'
-'wt'
e funziona, ma ora ho una riga bianca in più su ogni altra riga nel file.
Per rimediare, posso cambiare:
with open('test.csv', 'wt') as csv_file:
a:
with open('test.csv', 'wt', newline='') as csv_file:
Ma ora, si rompe Python 2.7:
TypeError: 'newline' is an invalid keyword argument for this function
So che potrei proprio fare qualcosa di simile :
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)
Tuttavia, questo ha qualche duplicazione grave.
Qualcuno ha un modo più pulito per farlo?
EDIT: I dati di test è semplice e non ha ritorni a capo o qualsiasi cosa:
items = [{'header1': 'value', 'header2': 'value2'},
{'header1': 'blah1', 'header2': 'blah2'}]
Non puoi semplicemente usare "w" anziché "wb" o "wt"? – nathancahill
Le stringhe nella lista 'item' contengono stringhe 'unicode' quando si esegue lo script in Python 2? I valori sono sempre ASCII o potrebbero includere caratteri extra che devono essere codificati? Anche se sei in grado di eseguire lo stesso codice in entrambe le versioni di Python, potresti non ottenere gli stessi risultati! – Blckknght
@Blckknght - Ho aggiunto i dati del test alla fine della domanda. È solo un testo ASCII. – Tamerz