¿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 \n
con \r\n
.
Respuestas:
Ver: La forma moderna: use newline = '' answer en esta misma página.
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.
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()
.
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").
'\n'
directo, esto es más explícito que ''
, y creo que es más fácil de leer.
'\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 \n
en 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
'\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.
Deberá utilizar el pseudo-modo binario al abrir el archivo.
f = open('file.txt', 'wb')