Python 2 CSV scrittore produce sbagliato terminatore di riga Windows
-
19-09-2019 - |
Domanda
Secondo il la sua documentazione csv.scrittore deve usare ' ', come lineterminator per impostazione predefinita.
import csv
with open("test.csv", "w") as f:
writer = csv.writer(f)
rows = [(0,1,2,3,4),
(-0,-1,-2,-3,-4),
("a","b","c","d","e"),
("A","B","C","D","E")]
print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
writer.writerows(rows)
print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
Questa stampa
\r\n
\r\n
come previsto.Ma, creato file csv utilizza il lineterminator ' '
0,1,2,3,4
0,-1,-2,-3,-4
a,b,c,d,e
A,B,C,D,E
Si tratta di un bug o c'è qualcosa di sbagliato nel mio utilizzo del csv.scrittore?
La versione di Python:
ActivePython 2.6.2.2 (ActiveState Software Inc.) basato su Python 2.6.2 (r262:71600, 21-Apr-2009, 15:05:37) [MSC v. 1500 32 bit (Intel)] su win32
su Windows Vista
Soluzione
In Python 2.x, sempre aprire il tuo file in binario modalità, come documentato. csv
scrive \r\n
come previsto, ma poi il sottostante di Windows file di testo meccanismo di tagli e modifiche che \n
per \r\n
...effetto totale: \r\r\n
Dal csv.writer
documentazione:
Se csvfile è un oggetto di tipo file deve essere aperto con il
'b'
bandiera piattaforme dove che fa la differenza.
Sembra che ci sia qualche reticenza in realtà pronunciando il nome del principale colpevole :-)
Edit:Come detto da @jebob nei commenti di questa risposta e basato su @Dave Burton risposta, per gestire questo caso sia in Python 2 e 3, è necessario effettuare le seguenti operazioni:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
Altri suggerimenti
Purtroppo, è un po ' diverso con il csv modulo per Python 3, ma questo codice funziona sia con Python 2 e Python 3:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
Per modificare il terminatore di linea in Python 2.7 csv scrittore uso
writer = csv.writer(f, delimiter = '|', lineterminator='\n')
Questo è un modo molto più semplice per modificare l'impostazione predefinita delimitatore .