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:
withdeclaraciónopen()os(particularmenteos.linesep)fuente
withes 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\nen Windows. No hay ninguna razón para perder el tiempo con os.linesep.\r\nque contiene el\nque se traduce a os.linesep, que es\r\nel 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
withinterior 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.linesepes equivalente a'hi there\r\n', que NO es equivalente a'hi there\n'.Es así de simple: uso
\nque 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.linesepen Windows en modo de texto, el resultado es el\r\r\nque está mal. "Windows usa ..." no tiene sentido. La biblioteca de tiempo de ejecución C (y por tanto Python) traducir\na\r\nen 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\ncomo 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.linesepes "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
withsalga 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,
writeterminé en 2.45s en mi máquina, mientras queprinttardó 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 elendparámetro opcional , por ejemplo;De cualquier forma que elija, le sugiero que use,
withya 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
writeestá 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
writey 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 dondeprintserían más eficientes son un poco raros.fuente
Desde 3.5 también puede usar el
pathlibpara 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
wmodo, debe agregar\ncaracteres al final de lawrite()función:fuente
También se puede usar el
iomódulo como en:fuente
Para escribir texto en un archivo en el matraz se puede usar:
fuente
También puedes probar
filewriterpip install filewriterEscribe en
my_file.txtToma un iterable o un objeto con
__str__soporte.fuente
Cuando necesito escribir muchas líneas nuevas, defino una lambda que usa una
printfunción:Este enfoque tiene la ventaja de que puede utilizar todas las funciones que están disponibles con la
printfunción.Actualización: como menciona Georgy en la sección de comentarios, es posible mejorar aún más esta idea con la
partialfunció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).