Python 2.7: Imprimir em arquivo

97

Por que tentar imprimir diretamente em um arquivo em vez de sys.stdoutproduzir o seguinte erro de sintaxe:

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

Da ajuda (__ builtins__), tenho as seguintes informações:

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.

Então, qual seria a sintaxe certa para alterar as gravações de impressão de fluxo padrão?

Eu sei que existem diferentes maneiras talvez melhores de gravar em um arquivo, mas eu realmente não entendo por que isso deve ser um erro de sintaxe ...

Uma boa explicação seria apreciada!

alex
fonte
3
Você tem certeza? print()é a função integrada python 3.x, enquanto printé o operador python <3.x. O post mostra 2.7.2+.
khachik de
2
Você fez from __future__ import print_function? Em Python <3, imprimir é uma declaração:
Ari
1
Não! Eu não fiz. Claro que voce esta certo. Isso resolve o problema. Droga! Portanto, a impressão documentada na ajuda (_ builtins_ ) é a versão futura (3.x) de impressão que tem uma sintaxe diferente. Muito obrigado e a você também, kachik
alex
2
IMO, help(__builtins__)exibir isso é um bug.
Wooble
3
... embora, investigar mais, python 2.7.2 não tem um built-in função de impressão, você simplesmente não pode acessá-lo facilmente normalmente ( __builtins__.__dict__['print'](value, file=f1)não funciona, embora).
Wooble

Respostas:

138

Se você quiser usar a printfunção em Python 2, terá que importar de __future__:

from __future__ import print_function

Mas você pode ter o mesmo efeito sem usar a função também:

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

imprimir é uma palavra-chave em python 2.X. Você deve usar o seguinte:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()
Simon Bergot
fonte
2
Você precisa adicionar '\ n' para torná-lo equivalente à impressão.
jlh
44

print(args, file=f1)é a sintaxe do python 3.x. Para uso 2.x python print >> f1, args.

citxx
fonte
3
Eu acho que você também deve mencionar from __future__ import print_function. Então você pode usar a notação clara em ambos, Python 2 e 3.
Martin Thoma
@moose, já existe uma excelente resposta do Gandaro, que inclui a minha resposta e a sua nota.
citxx
2
Recebo AttributeError: 'str' object has no attribute 'write'com sua sintaxe python3
Suncatcher
5
@Suncatcher, você provavelmente está tentando passar a string contendo o nome do arquivo como f1 em vez do objeto de arquivo real. Você precisa abrir o arquivo para escrever primeiro:f1 = open('path_to_your_file', 'w')
citxx
Sim, pensei que deveria ser o nome do arquivo, não o objeto do arquivo.
Suncatcher
13

Você pode exportar a instrução de impressão para um arquivo sem alterar nenhum código. Basta abrir uma janela de terminal e executar seu código desta maneira:

python yourcode.py >> log.txt
Lua Negra
fonte
11

Isso redirecionará sua saída de 'impressão' para um arquivo:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"
Daoctor
fonte
é patching de macaco?
Sarath Sadasivan Pillai
6

No Python 3.0+, printé uma função com a qual você chamaria print(...). Na versão anterior, printé uma declaração que você faria com print ....

Para imprimir em um arquivo em Python anterior à 3.0, você faria:

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

O >>operador direciona a impressão para o arquivo f.

Nam Nguyen
fonte
Eu gostaria de imprimir uma matriz inteira no arquivo. Se eu usar seu código, apenas o início e o fim do array foram impressos, como a saída do terminal. Como imprimir todas as linhas do array no arquivo?
Sigur
@Sigur "Como a saída do terminal" Desculpe, mas o bug está em outro lugar. Você não está dizendo ao Python para imprimir tudo, e é por isso que não está.
wizzwizz4