Python 2.7: Imprimir en archivo

97

¿Por qué intentar imprimir directamente en un archivo en lugar de sys.stdoutproducir el siguiente error de sintaxis?

Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f1=open('./testfile', 'w+')
>>> print('This is a test', file=f1)
  File "<stdin>", line 1
    print('This is a test', file=f1)
                            ^
SyntaxError: invalid syntax

De la ayuda (__ builtins__) tengo la siguiente información:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep:  string inserted between values, default a space.
    end:  string appended after the last value, default a newline.

Entonces, ¿cuál sería la sintaxis correcta para cambiar las escrituras de impresión de flujo estándar?

Sé que hay diferentes formas, tal vez mejores, de escribir en un archivo, pero realmente no entiendo por qué debería ser un error de sintaxis ...

¡Se agradecería una buena explicación!

alex
fuente
3
¿Estás seguro? print()es la función incorporada de python 3.x, mientras que el printoperador python <3.x. La publicación muestra 2.7.2+.
Khachik
2
¿Verdad from __future__ import print_function? En Python <3, print es una declaración:
Ari
1
¡No! No lo hice. Por supuesto que tienes razón. Eso resuelve el problema. ¡Maldita sea! Entonces, la impresión documentada en la ayuda ( _builtins_ ) es la versión futura (3.x) de la impresión que tiene una sintaxis diferente. Muchas gracias y tú también, kachik
alex
2
En mi opinión, help(__builtins__)mostrar eso es un error.
Wooble
3
... aunque, investigar más, Python 2.7.2 no tiene una función integrada de impresión, simplemente no puede acceder a él fácilmente normalmente ( __builtins__.__dict__['print'](value, file=f1)funciona, sin embargo).
Wooble

Respuestas:

138

Si desea utilizar la printfunción en Python 2, debe importar desde __future__:

from __future__ import print_function

Pero también puede tener el mismo efecto sin usar la función:

print >>f1, 'This is a test'
Gandaro
fuente
72

print es una palabra clave en python 2.X. Debes usar lo siguiente:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()
Simón Bergot
fuente
2
Debe agregar '\ n' para que esto sea equivalente a imprimir.
2018
44

print(args, file=f1)es la sintaxis de Python 3.x. Para el uso 2.x pitón print >> f1, args.

citxx
fuente
3
Creo que también deberías mencionarlo from __future__ import print_function. Entonces puede usar la notación clara en Python 2 y 3.
Martin Thoma
@moose, ya hay una excelente respuesta de Gandaro, que incluye mi respuesta y tu nota.
citxx
2
Llego AttributeError: 'str' object has no attribute 'write'con su sintaxis python3
Suncatcher
5
@Suncatcher, probablemente esté intentando pasar la cadena que contiene el nombre del archivo como f1 en lugar del objeto de archivo real. Primero debe abrir el archivo para escribir:f1 = open('path_to_your_file', 'w')
citxx
Sí, pensé que debería ser un nombre de archivo, no un objeto de archivo.
Suncatcher
13

Puede exportar la declaración de impresión a un archivo sin cambiar ningún código. Simplemente abra una ventana de terminal y ejecute su código de esta manera:

python yourcode.py >> log.txt
Luna oscura
fuente
11

Esto redirigirá su salida de 'impresión' a un archivo:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"
Daoctor
fuente
es parche de mono?
Sarath Sadasivan Pillai
6

En Python 3.0+, printes una función , con la que llamarías print(...). En la versión anterior, printes una declaración con la que harías print ....

Para imprimir en un archivo en Python anterior a 3.0, haría lo siguiente:

print >> f, 'what ever %d', i

El >>operador dirige la impresión al archivo f.

Nam Nguyen
fuente
Me gustaría imprimir una matriz completa en el archivo. Si utilizo su código, solo se imprimieron la cabeza y la cola de la matriz, como la salida de la terminal. ¿Cómo imprimir todas las líneas de matriz en el archivo?
Sigur
@Sigur "Me gusta la salida de la terminal" Lo siento, pero el error está en otra parte. No le está diciendo a Python que imprima todo, por eso no lo está.
wizzwizz4