python - write - ¿Forma correcta de escribir línea a archivo?




python write text file (7)

Estoy acostumbrado a print >>f, "hi there"

Sin embargo, parece que la print >> está en desuso. ¿Cuál es la forma recomendada de hacer la línea de arriba?

Actualización : con respecto a todas esas respuestas con "\n" ... ¿es esto universal o específico de Unix? IE, ¿debería estar haciendo "\r\n" en Windows?


Cuando dijiste Línea, significa que algunos caracteres serializados terminan en '\ n' caracteres. La línea debe ser la última en algún momento, por lo que deberíamos considerar '\ n' al final de cada línea. Aquí está la solución:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

en el modo de agregar después de cada escritura, mueva el cursor a la nueva línea, si desea usar el modo 'w', debe agregar '\ n' caracteres al final de la función write ():

the_file.write('Hello'+'\n')

Debería usar la función print() que está disponible desde Python 2.6+

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

Para Python 3 no necesita la import , ya que la función print() es la predeterminada.

La alternativa sería utilizar:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

Citando la documentación de Python sobre nuevas líneas:

En la salida, 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 '' , 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.


En Python 3 es una función, pero en Python 2 puedes agregar esto a la parte superior del archivo fuente:

from __future__ import print_function

Entonces tu haces

print("hi there", file=f)

Esto debería ser tan simple como:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

De la documentación:

No use os.linesep como terminador de línea al escribir archivos abiertos en modo de texto (el valor predeterminado); use un solo '\ n' en su lugar, en todas las plataformas.

Algunas lecturas útiles:


No creo que haya una manera "correcta".

Yo usaría:

with open ('myfile', 'a') as f: f.write ('hi there\n')

En memoria de Tim Toady .


Si está escribiendo muchos datos y la velocidad es una preocupación, probablemente debería ir con f.write(...) . Hice una comparación rápida de velocidad y fue considerablemente más rápido que print(..., file=f) al realizar un gran número de escrituras.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

En promedio, la write terminó en 2.45s en mi máquina, mientras que la print tomó aproximadamente 4 veces más tiempo (9.76s). Dicho esto, en la mayoría de los escenarios del mundo real esto no será un problema.

Si elige ir con la print(..., file=f) probablemente encontrará que querrá suprimir la nueva línea de vez en cuando, o reemplazarla con otra cosa. Esto se puede hacer configurando el parámetro end opcional, por ejemplo;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

Cualquiera que sea la forma que elija, sugeriría usarla ya que hace que el código sea mucho más fácil de leer.

Actualización : esta diferencia en el rendimiento se explica por el hecho de que la write está altamente almacenada en búfer y se devuelve antes de que realmente se realicen las escrituras en el disco (ver esta respuesta ), mientras que la print (probablemente) utiliza el búfer de línea. Una prueba simple para esto sería comprobar también el rendimiento para escrituras largas, donde las desventajas (en términos de velocidad) para el búfer de línea serían menos pronunciadas.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

La diferencia de rendimiento ahora se vuelve mucho menos pronunciada, con un tiempo promedio de 2.20 segundos para write y 3.10 segundos para print . Si necesita concatenar un montón de cadenas para obtener este gran rendimiento de línea sufrirá, por lo que los casos de uso donde la print sería más eficiente son un poco raros.


Respecto a os.linesep:

Aquí hay una sesión de intérprete de Python 2.7.1 sin editar en Windows:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

En Windows:

Como se esperaba, os.linesep NO produce el mismo resultado que '\n' . No hay forma de que pueda producir el mismo resultado. 'hi there' + os.linesep es equivalente a 'hi there\r\n' , que NO es equivalente a 'hi there\n' .

Es así de simple: use \n que se traducirá automáticamente a os.linesep. Y ha sido así de simple desde el primer puerto de Python para Windows.

No tiene sentido usar os.linesep en sistemas que no son Windows, y produce resultados incorrectos en Windows.

NO USE os.linesep!





file-io