¿Cómo escribir caracteres de fin de línea Unix en Windows?

80

¿Cómo puedo escribir en archivos usando Python (en Windows) y usar el carácter de fin de línea de Unix?

por ejemplo, al hacer:

f = abrir ('archivo.txt', 'w')
f.write ('hola \ n')
f.close ()

Python reemplaza automáticamente \ncon \r\n.

tttppp
fuente

Respuestas:

65

Para Python 2 y 3

Ver: La forma moderna: use newline = '' answer en esta misma página.

Solo para Python 2 (respuesta original)

Abra el archivo como binario para evitar la traducción de caracteres de final de línea:

f = open('file.txt', 'wb')

Citando el manual de Python:

En Windows, la 'b' agregada al modo abre el archivo en modo binario, por lo que también hay modos como 'rb', 'wb' y 'r + b'. Python en Windows hace una distinción entre archivos de texto y binarios; los caracteres de fin de línea en los archivos de texto se modifican ligeramente automáticamente cuando se leen o escriben datos. Esta modificación detrás de escena de los datos de archivo está bien para los archivos de texto ASCII, pero corromperá los datos binarios como ese en los archivos JPEG o EXE. Tenga mucho cuidado de utilizar el modo binario al leer y escribir dichos archivos. En Unix, no está de más agregar una 'b' al modo, por lo que puede usarlo independientemente de la plataforma para todos los archivos binarios.

Tamás
fuente
96

La forma moderna: use newline = ''

Use el newline=parámetro de palabra clave para io.open () para usar terminadores de fin de línea LF estilo Unix:

import io
f = io.open('file.txt', 'w', newline='\n')

Esto funciona en Python 2.6+. En Python 3 también puede usar el parámetro de open()la función incorporada en newline=lugar de io.open().

A la antigua: modo binario

La forma antigua de evitar la conversión de nueva línea, que no funciona en Python 3, es abrir el archivo en modo binario para evitar la traducción de caracteres de final de línea:

f = open('file.txt', 'wb')    # note the 'b' meaning binary

pero en Python 3, el modo binario leerá bytes y no caracteres, por lo que no hará lo que quieres. Probablemente obtendrá excepciones cuando intente realizar E / S de cadena en la transmisión. (por ejemplo, "TypeError: 'str' no es compatible con la interfaz de búfer").

Colin D. Bennett
fuente
1
Esto me ayuda usando esto: # newline = '' significa no convertir \ n plus.google.com/+PongsametreySOK/posts/2Bg8AdNJCxV
Osify
Puede establecer la nueva línea en '\n'directo, esto es más explícito que '', y creo que es más fácil de leer.
12431234123412341234123
1
@ 12431234123412341234123 Estoy de acuerdo, usar '\n'es más claro que ''. Entonces no necesitaré un comentario para explicar qué está haciendo el código :) Pero tenga en cuenta que esto solo es cierto para escribir archivos. Al leer archivos, newline='\n'no es exactamente lo mismo que newline='', ya que readlines()se dividirá solo \nen el primer caso, pero newline=''hará el manejo universal de nuevas líneas pero aún así devolverá las nuevas líneas reales del archivo en los datos. ¡Gracias por la sugerencia! Programa de prueba de Python
Colin D Bennett
Python 3.6+ (quizás también versiones anteriores de Python3). Si le preocupa un poco ver lo mismo '\n'que se cambió anteriormente, puede usar el punto de código Unicode (asegúrese de que la codificación sea utf-8 u otra compatible). with open('file.txt', 'w', encoding='utf-8', newline='\u000A'); PD: el resultado no es diferente de la newline='\n'versión, esto es solo si alguien quiere un poco más de comodidad.
bballdave025
9

Deberá utilizar el pseudo-modo binario al abrir el archivo.

f = open('file.txt', 'wb')
Jonathan Feinberg
fuente