2012-02-16 3 views
78

Perché si cerca di stampare direttamente su un file invece che sys.stdout produrre il seguente errore di sintassi:Python 2.7: Stampa su file

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 aiuto (__ builtins__) Ho le seguenti informazioni:

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. 

Quindi quale sarebbe la sintassi corretta per modificare le scritture di stampa in streaming standard?

So che ci sono diversi modi forse meglio scrivere su file, ma io davvero non capisco perché questo dovrebbe essere un errore di sintassi ...

Una bella spiegazione sarebbe apprezzato!

+3

Sei sicuro? 'print()' è la funzione built-in python 3.x, mentre 'print' è python <3.x operator. Il post mostra '2.7.2 +'. – khachik

+2

Vieni 'da __future__ import print_function'? In Python <3, la stampa è una dichiarazione: – Ari

+1

No! Non l'ho fatto Certo che hai ragione. Questo risolve il problema. Dannazione! Quindi la guida di stampa documentata (\ __ builtins__) è la versione futura (3.x) della stampa che ha una sintassi diversa. Grazie mille e anche a te, kachik – alex

risposta

117

Se si desidera utilizzare la funzione di print in Python 2, è necessario importare da __future__:

from __future__ import print_function 

Ma si può avere lo stesso effetto senza utilizzare la funzione, anche:

print >>f1, 'This is a test' 
50

stampa è una parola chiave in python 2.X. Si dovrebbe usare la seguente:

f1=open('./testfile', 'w+') 
f1.write('This is a test') 
f1.close() 
26

print(args, file=f1) è la sintassi di Python 3.x. Per python 2.x utilizzare print >> f1, args.

+3

Penso che dovresti menzionare anche "da __future__ import print_function'. Quindi puoi usare la notazione chiara in entrambi, Python 2 e 3. –

+0

@moose, c'è già un'ottima risposta di Gandaro, che include la mia risposta e la tua nota. – citxx

+0

Ottiene 'AttributeError: 'str' oggetto non ha attributo 'write'' con la tua sintassi python3 – Suncatcher

6

In Python 3.0+, print è una funzione , che chiamereste con print(...). Nella versione precedente, print è una dichiarazione , che faresti con print ....

Per stampare su un file in Python precedenti alla 3.0, faresti:

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

L'operatore >> dirige stampare il file f.

+0

Mi piacerebbe stampare un intero array sul file. Se utilizzo il tuo codice, è stata stampata solo la testata e la coda della matrice, come l'output dal terminale. Come stampare tutte le linee dell'array sul file? – Sigur

+0

@Sigur "Come l'output dal terminale" Scusa, ma il bug è altrove. Non stai dicendo a Python di stampare tutto, e questo è il motivo per cui non lo è. – wizzwizz4

11

È possibile esportare l'istruzione di stampa in un file senza modificare alcun codice. Basta aprire una finestra di terminale ed eseguire il codice in questo modo:

python yourcode.py >> log.txt 
2

Questo reindirizzerà la vostra stampa su un file

import sys 
sys.stdout = open("file.xt", "w+") 
print "this line will redirect to file.txt"