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

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top