2011-01-05 6 views
28

Tengo una secuencia de comandos python que proporciona resultados diferentes cuando se ejecuta en una máquina con Windows y cuando se ejecuta en una Mac. Al cavar más profundo, descubrí que era porque cuando Python leía en línea saltos en la Mac (de un archivo), decía en \r\n, mientras que de alguna manera en Windows el \r desaparece.Manejo r n vs n nuevas líneas en python en Mac vs Windows

Por lo tanto, si cambio cada \n en la secuencia de comandos a \r\n, funciona bien en la Mac. Pero si lo hago, deja de funcionar en la PC con Windows.

¿Hay una manera fácil de solucionar este problema?

+0

que está teniendo este error durante la lectura de un archivo? ¿En qué versión de python estás? ¿Dónde lo obtuviste? Python generalmente se construye con soporte de nueva línea universal – Falmarri

+0

@Falmarri Python 3 ... y estoy bastante seguro de que lo obtuve del sitio web oficial de Python – wrongusername

+3

Aquí hay otra inconsistencia de Windows vs Linux: en Windows, la función glob.glob de Python siempre devuelve una lista nombres de archivo, ordenados alfabéticamente En Linux, la lista de nombres de archivos se devuelve en orden aleatorio. – PaulMcG

Respuesta

22

Supongo que puede depender de lo que está leyendo, pero la función integrada open() toma un parámetro 'modo', y si pasa 'U' para el modo, Python se encargará de la nuevas líneas en una plataforma cruzada de forma transparente. Requiere que Python se construya con soporte de nueva línea universal, ¡pero pruébelo!

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

+0

Este también es el predeterminado (por lo que sé) – Falmarri

+0

¡Gracias! ¡Funciona bien ahora!Oh y @Falmarri, lo siento, la única forma que sabía de cómo leer un archivo era con ''r''. Al menos ahora sé mejor. – wrongusername

+0

Hmm, parece que eso no es lo predeterminado en Python 3. Eso parece extraño. – Falmarri

34

diferentes plataformas tienen diferentes códigos para "nueva línea". Windows tiene \ r \ n, Unix tiene \ n, los viejos Macs tienen \ ry sí, hay algunos sistemas que también tienen \ n \ r.

Cuando abre un archivo en modo texto en Python 3, convertirá todas las líneas nuevas a '\ n' y terminará con él.

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

El modo de texto es el predeterminado, por lo que si no dice nada, se trata de modo de texto. Pero siempre es mejor ser explícita:

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

Si no desea que la traducción de los finales de línea suceda, abra el archivo en modo binario:

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

En Python 2 es diferente. Allí esta conversión solo ocurriría por defecto en Windows. Si quería que sucediera en otras plataformas, se podría añadir la bandera de nueva línea universal

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

Sin embargo, usted dice que usted está en Python 3, y allí se sucede en el modo de texto en todos plataformas, así que agregar la bandera U no debería hacer ninguna diferencia.

+0

Muchas gracias, tuve una idea de que era así, me llevó bastante tiempo confirmarlo, pero sí mi código funcionó en Python 2.7 pero falló en Python 3.2 debido a esa diferencia. Necesitaba "robarlo" ... gracias, una explicación muy completa. – sinekonata

+0

'os.linesep' se reemplaza por' \ n' mientras lee en modo texto en * todas * plataformas (no solo Windows). Si 'os.linesep == '\ n'' entonces es lo mismo que ninguna conversión en Python 2. – jfs

+0

@JFSebastian: Lo que en la práctica significa que solo ocurre en Windows (y Mac OS 9, pero eso no es compatible desde Python 2.4). Mientras que en Python 3, todas las combinaciones de nueva línea se traducirán a ''\ n'' en todas las plataformas. –

Cuestiones relacionadas