2012-05-28 10 views
6

posible duplicado:
Handling \r\n vs \n newlines in python on Mac vs WindowsLos finales de línea en pitón

estoy un poco confundido por algo, y me pregunto si esto es una cosa pitón. Tengo un archivo de texto que usa terminaciones de línea de Windows ("\ r \ n"), pero si repito algunas de las líneas del archivo, guárdelas en una lista e imprima la representación de cadena de la lista en la consola. , muestra "\ n" finales de línea. ¿Me estoy perdiendo de algo?

+0

Podría ayudarle a resolver el problema: http://stackoverflow.com/questions/4599936/handling-rn-vs-n-newlines-in-python-on-mac-vs- windows –

+3

La terminación de línea es algo confusa .Python puede manejarlos automáticamente por usted a menos que abra su archivo en modo binario ('open (..., 'rb')'), dependiendo de su plataforma. – katrielalex

+0

Gracias chicos, abrir el archivo en modo binario resolvió el problema para mí. –

Respuesta

6

Sí, es una cosa de pitón; de forma predeterminada, open() abre archivos en modo texto, donde las terminaciones de línea se traducen según la plataforma en la que se esté ejecutando el código. Tendrás que abrir el archivo en modo binario ('b') para evitar esto.

Desde el documentation on open:

Los valores más comúnmente utilizadas de modo son 'r' para la lectura, 'w' para la escritura (truncando el archivo si ya existe), y 'a' para anexar (que en algunos sistemas Unix significa que todas las escrituras se agregan al final del archivo independientemente de la posición de búsqueda actual). Si se omite el modo, el valor predeterminado es 'r'. El valor predeterminado es usar el modo de texto, que puede convertir '\ n' caracteres a una representación específica de la plataforma en la escritura y viceversa. Por lo tanto, al abrir un archivo binario, debe agregar 'b' al valor de modo para abrir el archivo en modo binario, lo que mejorará la portabilidad. (Agregar 'b' es útil incluso en sistemas que no tratan los archivos binarios y de texto de manera diferente, donde sirve como documentación.)

7

Al abrir el archivo en modo binario evitará esto en Py2 en Windows. Sin embargo, en Py3 (y en Py2.6 + si usa io.open en lugar de la opción incorporada), el modo binario frente al modo de texto significa algo bien definido e independiente de la plataforma, y ​​no afecta a las nuevas líneas universales. En su lugar, puede hacer:

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

Y las nuevas líneas no se normalizarán.

5

Lo que debe hacer es abrir el archivo con soporte universal de nueva línea (para Python 2.x). Esto se hace con un modo de "U" o "rU". Cualquier tipo de línea nueva es entonces compatible. La siguiente documentación se proporciona en el manual de Python http://docs.python.org/library/functions.html#open:

Además del modo de valores fopen() estándar puede ser 'U' o 'rU'. Python generalmente se construye con soporte de nueva línea universal; al suministrar 'U' se abre el archivo como un archivo de texto, pero las líneas pueden terminarse por cualquiera de los siguientes: la convención de final de línea de Unix '\ n', la convención de Macintosh '\ r' o la convención de Windows '\ r \ n '. Todas estas representaciones externas son vistas como '\ n' por el programa Python. Si Python se construye sin soporte de nueva línea universal, un modo con 'U' es el mismo que el modo de texto normal. Tenga en cuenta que los objetos de archivo así abiertos también tienen un atributo llamado newlines que tiene un valor de None (si aún no se han visto nuevas líneas), '\ n', '\ r', '\ r \ n' o una tupla que contiene todos los tipos de nueva línea vistos.

Para Python 3, hay una opción de nueva línea para abrir que controla el comportamiento de las líneas nuevas. Al mirar la documentación, parece que el soporte universal de nueva línea es el predeterminado.

Cuestiones relacionadas