Estoy acostumbrado a hacer print >>f, "hi there"
Sin embargo, parece que print >>
está en desuso. ¿Cuál es la forma recomendada de hacer la línea de arriba?
Actualización : Respecto a todas esas respuestas con "\n"
... ¿es universal o específico de Unix? IE, ¿debería estar haciendo "\r\n"
en Windows?
Respuestas:
Esto debería ser tan simple como:
De la documentación:
Algunas lecturas útiles:
with
declaraciónopen()
os
(particularmenteos.linesep
)fuente
with
es una forma más segura de recordar cerrar un archivo.the_file.close()
?Debe usar la
print()
función que está disponible desde Python 2.6+Para Python 3 no necesita
import
, ya que laprint()
función es la predeterminada.La alternativa sería usar:
Citando de la documentación de Python sobre nuevas líneas:
fuente
\n
" require newline = "", de lo contrario obtendría\r\r\n
en Windows. No hay ninguna razón para perder el tiempo con os.linesep.\r\n
que contiene el\n
que se traduce a os.linesep, que es\r\n
el resultado final\r\r\n
.open('myfile','a')
en su lugaropen('myfile','w')
?Los documentos de Python recomiendan de esta manera:
Entonces esta es la forma en que generalmente lo hago :)
Declaración de docs.python.org :
fuente
with
interior de un bucle. Eso me hace abrir y cerrar constantemente el archivo a medida que avanzo en mi ciclo. ¿Quizás me estoy perdiendo algo aquí, o esto es realmente una desventaja en este escenario particular?En cuanto a os.linesep:
Aquí hay una sesión de intérprete Python 2.7.1 exacta sin editar en Windows:
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: uso
\n
que se traducirá automáticamente a os.linesep. Y ha sido así de simple desde el primer puerto de Python a Windows.No tiene sentido usar os.linesep en sistemas que no son de Windows, y produce resultados incorrectos en Windows.
¡NO USE os.linesep!
fuente
os.linesep
en Windows en modo de texto, el resultado es el\r\r\n
que está mal. "Windows usa ..." no tiene sentido. La biblioteca de tiempo de ejecución C (y por tanto Python) traducir\n
a\r\n
en la salida en modo texto. Otro software puede comportarse de manera diferente. NO es el caso de que todo el software que se ejecuta en Windows reconozca un solitario\n
como separador de línea cuando se lee en modo texto. Python lo hace. El editor de texto del Bloc de notas de Microsoft no.\r
...os.linesep
es "incorrecto" aquí. Es comoDepartment of Redundancy Department
. Sí, tú puedes hacerlo. No, no quieres hacerlo.No creo que haya una forma "correcta".
Yo usaría:
En memoria de Tim Toady .
fuente
with
salga del alcance.open(..., 'a')
o incluso'at'
.En Python 3 es una función, pero en Python 2 puede agregar esto al principio del archivo fuente:
Entonces lo haces
fuente
Si está escribiendo una gran cantidad de datos y la velocidad es una preocupación que probablemente debería seguir
f.write(...)
. Hice una comparación de velocidad rápida y fue considerablemente más rápido queprint(..., file=f)
cuando realizaba una gran cantidad de escrituras.En promedio,
write
terminé en 2.45s en mi máquina, mientras queprint
tardó aproximadamente 4 veces más (9.76s). Dicho esto, en la mayoría de los escenarios del mundo real, esto no será un problema.Si elige ir
print(..., file=f)
, probablemente encontrará que querrá suprimir la nueva línea de vez en cuando, o reemplazarla por otra cosa. Esto puede hacerse configurando elend
parámetro opcional , por ejemplo;De cualquier forma que elija, le sugiero que use,
with
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
write
está altamente protegida y regresa antes de que se realicen las escrituras en el disco (vea esta respuesta ), mientras queprint
(probablemente) usa el almacenamiento en línea de la memoria intermedia. Una prueba simple para esto sería verificar el rendimiento de escrituras largas también, donde las desventajas (en términos de velocidad) para el almacenamiento en línea serían menos pronunciadas.La diferencia de rendimiento ahora se vuelve mucho menos pronunciada, con un tiempo promedio de 2.20s para
write
y 3.10s paraprint
. Si necesita concatenar un montón de cadenas para obtener este rendimiento de línea tan largo, sufrirá, por lo que los casos de uso dondeprint
serían más eficientes son un poco raros.fuente
Desde 3.5 también puede usar el
pathlib
para ese propósito:fuente
Cuando dijo Línea, significa algunos caracteres serializados que terminan en '\ n' caracteres. La línea debe ser la última en algún punto, por lo que debemos considerar '\ n' al final de cada línea. Aquí hay solución:
en el modo de agregar después de cada escritura, el cursor se mueve a una nueva línea, si desea usar el
w
modo, debe agregar\n
caracteres al final de lawrite()
función:fuente
También se puede usar el
io
módulo como en:fuente
Para escribir texto en un archivo en el matraz se puede usar:
fuente
También puedes probar
filewriter
pip install filewriter
Escribe en
my_file.txt
Toma un iterable o un objeto con
__str__
soporte.fuente
Cuando necesito escribir muchas líneas nuevas, defino una lambda que usa una
print
función:Este enfoque tiene la ventaja de que puede utilizar todas las funciones que están disponibles con la
print
función.Actualización: como menciona Georgy en la sección de comentarios, es posible mejorar aún más esta idea con la
partial
función:En mi humilde opinión, este es un enfoque más funcional y menos críptico.
fuente
from functools import partial; fwl = partial(print, file=out)
.