Evite escribir retorno de carro al escribir salto de línea con Python

Si se tiene en cuenta que el carriage return = \r line feed = \n

 Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> '{:02x}'.format(ord('\n')) '0a' >>> '{:02x}'.format(ord('\r')) '0d' 

¿Cómo evitar el retorno de carro de escritura cuando se utiliza open('filename','w').write('text\n') ?

En modo interactivo puedes hacer esto:

 >>> open('filename','w').write('text\n') 5 >>> for c in open('filename','r').read(): ... print('{:02x}'.format(ord(c))) ... 74 65 78 74 0a 

Esto indicaría que solo se ha escrito el avance de línea, por lo tanto, debe tener una longitud de 5 bytes.

 -rw-r--r-- 1 djuric 197121 6 Jul 15 21:00 filename ^ 

En realidad es de 6 bytes de longitud. Ahora esto puede ser una “cosa de Windows”, pero cuando abre el archivo en Notepad ++ por ejemplo, y gira Ver> Mostrar símbolos> Mostrar todos los caracteres , puede ver el retorno del carro allí.

    Después de presionar CTRL + H y reemplazar sin usar el modo de búsqueda extendida, solo queda avance de línea. Después de guardar el archivo, solo el avance de línea está en el archivo y el archivo tiene 5 bytes de longitud.

     -rw-r--r-- 1 djuric 197121 5 Jul 15 20:58 filename1 ^ 

    Entonces, ¿por qué Notepad ++ es capaz de guardar saltos de línea sin retorno de carro, pero python no puede?

    Puede hacer esto pasando '' al parámetro de newline al abrir el archivo de texto.

     f = open('test.txt', 'w', newline='') f.write('Only LF\n') f.write('CR + LF\r\n') f.write('Only CR\r') f.write('Nothing') f.close() 

    Como se describe en los documentos :

    nueva línea controla cómo funciona el modo de nuevas líneas universal (solo se aplica al modo de texto). Puede ser Ninguno, ”, ‘\ n’, ‘\ r’ y ‘\ r \ n’. Funciona de la siguiente manera:

    • Al leer la entrada de la transmisión, si la nueva línea es Ninguna, se habilita el modo de nuevas líneas universal. Las líneas en la entrada pueden terminar en ‘\ n’, ‘\ r’ o ‘\ r \ n’, y estas se traducen en ‘\ n’ antes de ser devueltas a la persona que llama. Si es ”, se habilita el modo de líneas nuevas universales, pero los finales de línea se devuelven al llamante sin traducir. Si tiene alguno de los otros valores legales, las líneas de entrada solo terminan con la cadena dada, y el final de la línea se devuelve a la persona que llama sin traducir.

    • Cuando se escribe la salida en el flujo, si la nueva línea es Ninguna, todos los caracteres ‘\ n’ escritos se convierten al separador de línea predeterminado del sistema, os.linesep. Si newline es ” o ‘\ n’, no se realiza ninguna traducción. Si nueva línea es cualquiera de los otros valores legales, cualquier carácter ‘\ n’ escrito se traduce a la cadena dada.

    El valor predeterminado para newline es None , especificando '' , obliga a Python a escribir la nueva línea ( \n o \r ) sin traducirla.