2012-05-28 16 views
6

Eventuali duplicati:
Handling \r\n vs \n newlines in python on Mac vs Windowsterminazioni di linea in pitone

Sono un po 'confuso da qualcosa, e mi chiedo se questa è una cosa pitone. Ho un file di testo che utilizza terminazioni di riga di Windows ("\ r \ n"), ma se eseguo l'iterazione di alcune righe nel file, le memorizzo in un elenco e stampo la rappresentazione di stringa dell'elenco sulla console , mostra "\ n" fine linea. Mi sto perdendo qualcosa?

+0

Potrebbe aiutarti a risolvere il problema: http://stackoverflow.com/questions/4599936/handling-rn-vs-n-newew-in-python-on-mac-vs-windows –

+3

La fine della linea è un po 'confusa .Python può gestirli automaticamente per te a meno che tu non apra il tuo file in modalità binaria ('open (..., 'rb')'), a seconda della tua piattaforma. – katrielalex

+0

Grazie ragazzi, l'apertura del file in modalità binaria ha risolto il problema per me. –

risposta

6

Sì, è una cosa di pitone; per impostazione predefinita, open() apre i file in modalità testo, dove le terminazioni di riga vengono tradotte in base alla piattaforma su cui viene eseguito il codice. Dovrai aprire il file in modalità binaria ('b') per impedirlo.

Dal documentation on open:

I valori più comunemente usati di modalità sono 'r' per la lettura, 'w' per la scrittura (troncando il file se esiste già), e 'un' per l'aggiunta (che su alcuni sistemi Unix significa che tutte le scritture si aggiungono alla fine del file indipendentemente dalla posizione di ricerca corrente). Se la modalità è omessa, viene impostata su "r". L'impostazione predefinita è utilizzare la modalità testo, che può convertire i caratteri \ n 'in una rappresentazione specifica della piattaforma durante la scrittura e di nuovo nella lettura. Pertanto, quando si apre un file binario, è necessario aggiungere "b" al valore della modalità per aprire il file in modalità binaria, il che migliorerà la portabilità. (L'aggiunta di 'b' è utile anche su sistemi che non trattano file binari e di testo in modo diverso, dove funge da documentazione.)

7

L'apertura del file in modalità binaria lo eviterà in Py2 su Windows. Tuttavia, in Py3 (e in Py2.6 + se si utilizza io.open invece del builtin), la modalità binaria rispetto alla modalità testo indica qualcosa ben definito e indipendente dalla piattaforma e non influisce sulle nuove righe universali. Invece, puoi fare:

file = open(filename, 'r', newline='') 

E le nuove righe non verranno normalizzate.

5

Quello che dovresti fare è aprire il file con il supporto newline universale (per Python 2.x). Questo viene fatto con una modalità di "U" o "rU". Viene quindi supportato qualsiasi tipo di newline. La seguente documentazione è fornita nel manuale python http://docs.python.org/library/functions.html#open:

Oltre ai valori standard di fopen(), la modalità può essere "U" o "rU". Python di solito è costruito con un supporto newline universale; fornendo 'U' apre il file come un file di testo, ma le linee possono essere terminate in uno dei seguenti modi: la convenzione di fine riga di Unix '\ n', la convenzione di Macintosh '\ r' o la convenzione di Windows '\ r \ n'. Tutte queste rappresentazioni esterne sono viste come '\ n' dal programma Python. Se Python è costruito senza supporto newline universale, una modalità con "U" è la stessa della normale modalità testo. Nota che gli oggetti file così aperti hanno anche un attributo chiamato newline che ha il valore None (se non sono ancora stati visti newline), '\ n', '\ r', '\ r \ n', o una tupla contenente tutto i tipi di nuova visione visti.

Per Python 3, è disponibile un'opzione di apertura di nuova riga che controlla il comportamento delle newline. Guardando la documentazione, sembra che il supporto newline universale sia l'impostazione predefinita.

Problemi correlati