2011-12-22 18 views
27

Hay al menos dos formas de escribir en un archivo en Python:f.write vs impresión >> f

f = open(file, 'w') 
f.write(string) 

o

f = open(file, 'w') 
print >> f, string 

¿Hay alguna diferencia entre los dos? ¿O es alguien más pitónico? Intento escribir un montón de HTML en el archivo, así que necesito un montón de instrucciones de escritura/impresión a través de mi archivo (pero no necesito un motor de plantillas).

+3

Es pitónico ser explícito. '.write() 'expresa tu intención más claramente que' >> ' –

+5

Corrígeme si me equivoco, pero con las versiones más nuevas de Python (3.x) print es una * función * (no una construcción de declaración de sintaxis especial) y por lo tanto la ¿El último ni siquiera funcionará en esos? (Realmente no he usado Python desde ... 2.6ish.) –

+0

@pst: muy buen punto. Lo mejor es utilizar el método 'write()'. – voithos

Respuesta

24

print hace cosas file.write no, lo que le permite omitir el formato de cadena para algunas cosas básicas.

Inserta espacios entre argumentos y agrega el terminador de línea.

print "a", "b" # prints something like "a b\n" 

llama a la __str__ o __repr__ métodos especiales de un objeto para convertirlo en una cadena.

print 1 # prints something like "1\n" 

Usted tendría que hacer manualmente estas cosas si se ha utilizado en lugar de file.writeprint.

1

La documentación en print podría ayudar a explicar esto: print statement (documentación de Python 2.7).

print, de forma predeterminada, se imprime a la salida estándar, que de hecho es un objeto "similar a un archivo" (sys.stdout). La salida estándar tiene un método write(). Usar print >> f parece ser una abstracción innecesaria.

Además, me parece demasiado detallado. f.write() está bien.

+0

¿Las líneas nuevas ('\ n') son constantes en todas las plataformas? ¿Me gustaría usar f.write (string + '\ n') y esperar una nueva línea en todas las plataformas? – oxuser

+0

Por lo que sé, sí. Python realiza las conversiones por usted, de forma predeterminada, aunque esto puede anularse si así lo desea. – voithos

+0

@agf: tiene un error. De forma predeterminada, Python abre archivos en el modo "texto" y automatiza la conversión de final de línea al escribir. Tiene que agregar explícitamente "b" al modo abierto de archivo para tenerlo en modo binario, sin conversiones. – jsbueno

1

Como línea de fondo: utilice file.write al escribir en archivos.

El modismo ">>" para imprimir fue tomado prestado de C++ en los primeros días de Python, y es bastante antipático - tanto que ya no existe en Python 3.x - donde uno puede usar la impresión, ahora una función de una declaración, para escribir en un archivo, pero sin una sintaxis especial para eso.

Como @agf señala en su respuesta, usar "imprimir" para escribir en un archivo hace más cosas que simplemente llamar a escritura; llama automáticamente a str (obj) para obtener una representación de cadena del objeto, mientras que .write requiere una cadena de (byte) se pasa como parámetro: en el mundo de Python, "explícito es mejor que implícito", por lo que un motivo más para que uno vaya con file.write en su lugar.

+3

"Explicit is better than implicit" should *** NOT *** ¡léelo como "usa operaciones de bajo nivel, no abstracciones de nivel superior" !! La mala sintaxis de la declaración de impresión es un problema, * no * que agrupa las operaciones comúnmente utilizadas en un paquete conveniente. – Ben

1

Esta es la manera preferida, mediante controladores de contexto:

with open(file, 'w') as f: 
    f.write(string) 

En Python 2 prefiero file.write porque la sintaxis >> está en desuso. Para python 3, es posible que prefiera utilizar la función de impresión, que debe tener en cuenta algunas cosas adicionales (por ejemplo, convertir automáticamente números a cadenas, etc.).

+2

Verdadero pero no relacionado, aún necesitaría un administrador de contexto con 'print >> f' – Kos

14

No estoy de acuerdo con algunas de las opiniones expresadas aquí, que print >> f es redundante y debe evitarse en favor de f.write.

print y file.write son operaciones bastante diferentes. file.write simplemente escribe directamente una cadena en un archivo. print es más como "renderizar valores a stdout como texto". Naturalmente, el resultado de representar una cadena como texto es solo la cadena, por lo que print >> f, my_string y f.write(my_string) son casi intercambiables (a excepción de la adición de una nueva línea). Pero su elección entre file.write y print normalmente debería basarse en lo que está haciendo; ¿Estás escribiendo una cadena en un archivo o estás representando valores en un archivo?

Claro, print no es estrictamente necesario, en el que puede implementarlo con file.write. Pero entonces file.write no es estrictamente necesario, porque puede implementarlo con las operaciones en os para tratar los descriptores de archivos. Realmente son operaciones en diferentes niveles, y debe usar el que sea más apropiado para su uso (normalmente el nivel en el que está trabajando otro código cercano, o el nivel más alto que no se interpone en su camino).

Siento que la sintaxis print >> f es bastante horrible, y es un muy buen ejemplo de por qué print debería haber sido una función desde el principio. Esto se mejoró mucho en Python 3. Pero incluso si está escribiendo el código de Python 2 que planea exportar a Python 3, es mucho más fácil de convertir print >> f, thing1, thing2, thing3, ... en print(thing1, thing2, thing3, file=f) que convertir la circunlocución donde gira su propio código para hacer el equivalente de la representación de print y luego llamar al f.write(text). Estoy bastante seguro de que el convertidor semiautomático de Python 2 a Python 3 incluso hará la conversión por usted, lo cual no podría hacer si evita el formulario print >> f.

Línea inferior: use print para representar los valores en stdout (o en un archivo). Use f.write para escribir texto en un archivo.

2

De acuerdo con @agf

prefería print(..., file=f) debido a su flexibilidad.

with open('test.txt', 'w') as f: 
    print('str', file=f) 
    print(1, 20, file=f) 

También es fácil de convertir print comando existente.

write acepta solo una cadena.

3

No debe hacer ninguna de esas cosas. Lo más Pythonic que hacer es utilizar la función de impresión Python 3 (a diferencia de la impresión 2 del pitón comunicado):

f = open(file, 'w') 
print(string, file=f) 

Por supuesto, la forma ideal de hacerlo es utilizar simplemente Python 3. Pero si le pegan usando Python 2 puede convertirlo en el uso de un future statement en la parte superior del archivo:

from __future__ import print_function 

Tenga en cuenta que esto cambia la impresión de otras maneras, lo más obvio en que es necesario agregar corchetes en torno a sus argumentos . Pero los cambios son todas mejoras, que es la razón principal para el cambio en Python 3. Mientras lo hace, considere usar todas las declaraciones futuras para obtener la mayor cantidad posible de mejoras de Python 3.