2011-01-05 6 views
28

Ho uno script python che ha dato un output diverso quando viene eseguito su una macchina Windows e quando viene eseguito su un Mac. Scavando più a fondo, ho scoperto che era perché quando Python leggeva le interruzioni di riga sul Mac (da un file), leggeva nel \r\n, mentre in qualche modo in Windows lo \r scompare.Gestione r n vs n newline in python su Mac vs Windows

Pertanto, se cambio ogninello script su \r\n, funziona correttamente su Mac. Ma se lo faccio, smette di funzionare sul PC Windows.

C'è un modo semplice per risolvere questo problema?

+0

hai questo errore durante la lettura da un file? Su quale versione di python sei? Dove l'hai preso? Python di solito è costruito con il supporto universale newline – Falmarri

+0

@Falmarri Python 3 ... e sono abbastanza sicuro di averlo ricevuto dal sito ufficiale Python – wrongusername

+3

Ecco un'altra incongruenza tra Windows e Linux - su Windows, la funzione glob.glob di Python restituisce sempre un elenco nomi di file, in ordine alfabetico. Su Linux, l'elenco dei nomi di file viene restituito in ordine casuale. – PaulMcG

risposta

22

Suppongo che dipenda da cosa stai leggendo, ma la funzione built-in open() accetta un parametro 'mode', e se passi 'U' per la modalità, Python si prenderà cura di newline in modo cross-platform in modo trasparente. Richiede che Python sia costruito con un supporto newline universale, ma provalo!

http://docs.python.org/library/functions.html#open

+0

Questo è anche il valore predefinito (per quanto ne so) – Falmarri

+0

Grazie! Funziona bene ora!Oh e @ Flormarri mi dispiace, l'unico modo che sapevo di come leggere da un file era con '' r''. Almeno adesso lo so meglio. – wrongusername

+0

Hmm, sembra che non sia il default in python 3. Sembra strano. – Falmarri

34

diverse piattaforme hanno codici diversi per "nuova linea". Windows ha \ r \ n, Unix ha \ n, i vecchi Mac hanno \ r e sì, ci sono anche alcuni sistemi che hanno \ n \ r.

Quando si apre un file in modalità testo in Python 3, converte tutte le nuove righe in "\ n" e si può fare con esso.

infile = open("filename", 'r') 

La modalità testo è predefinita, quindi se non si dice nulla, è la modalità testo. Ma è sempre meglio essere espliciti:

infile = open("filename", 'rt') 

Se non si desidera la traduzione di fine riga avvenga, aprire il file in modalità binaria:

infile = open("filename", 'rb') 

In Python 2 è diverso. Lì questa conversione avverrebbe solo per impostazione predefinita su Windows. Se si voleva che accadesse su altre piattaforme, è possibile aggiungere il flag a capo universale:

infile = open("filename", 'rU') 

Tuttavia, si dice che si è in Python 3, e ci capita in modalità testo su tutti piattaforme, quindi aggiungere la bandiera U non dovrebbe fare alcuna differenza.

+0

Grazie mille mi è venuta l'idea che fosse così, mi ci è voluto molto tempo per confermarlo, ma sì il mio codice ha funzionato su python 2.7 ma ha glitchato su python 3.2 a causa di questa differenza. Avevo bisogno di "rb" it ... grazie, spiegazione molto approfondita. – sinekonata

+0

'os.linesep' è sostituito da' \ n' durante la lettura in modalità testo su piattaforme * all * (non solo Windows). Se 'os.linesep == '\ n'' allora è lo stesso di nessuna conversione su Python 2. – jfs

+0

@JFSebastian: che in pratica significa che accade solo su Windows (e Mac OS 9, ma non è supportato dal Python 2.4). Mentre in Python 3 tutte le combinazioni di nuova riga saranno tradotte in ''\ n'' su tutte le piattaforme. –