Python 2.7: stampa su file


97

Perché provare a stampare direttamente su un file invece di sys.stdoutprodurre il seguente errore di sintassi:

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

Dalla guida (__ 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 giusta per modificare il flusso standard di scrittura in stampa?

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

Una bella spiegazione sarebbe apprezzata!


3
Sei sicuro? print()è la funzione incorporata di python 3.x, mentre printè l'operatore python <3.x. Il post mostra 2.7.2+.
khachik

2
L'hai fatto from __future__ import print_function? In Python <3, print è una dichiarazione:
Ari

1
No! Non l'ho fatto. Naturalmente hai ragione. Questo risolve il problema. Dannazione! Quindi la stampa documentata in help (_ builtins_ ) è la versione futura (3.x) di print che ha una sintassi diversa. Grazie mille e anche a te, kachik
alex

2
IMO, help(__builtins__)dimostrarlo è un bug.
Wooble,

3
... anche se, indagando ulteriormente, pitone 2.7.2 non ha un built-in funzione di stampa, basta non può accedere facilmente normalmente ( __builtins__.__dict__['print'](value, file=f1)funziona, però).
Wooble

Risposte:


138

Se vuoi usare la printfunzione in Python 2, devi importare da __future__:

from __future__ import print_function

Ma puoi avere lo stesso effetto anche senza usare la funzione:

print >>f1, 'This is a test'

72

print è una parola chiave in python 2.X. Dovresti usare quanto segue:

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

2
Devi aggiungere '\ n' per rendere questo equivalente alla stampa.
jlh

44

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


3
Penso che dovresti anche menzionare from __future__ import print_function. Quindi puoi usare la chiara notazione in entrambi, Python 2 e 3.
Martin Thoma

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

2
Ho AttributeError: 'str' object has no attribute 'write'capito con la tua sintassi python3
Suncatcher

5
@Suncatcher, probabilmente stai tentando di passare la stringa contenente il nome del file come f1 invece dell'effettivo oggetto file. Devi prima aprire il file per scrivere:f1 = open('path_to_your_file', 'w')
citxx

Sì, ho pensato che dovesse essere il nome del file, non l'oggetto del file.
Suncatcher

13

È possibile esportare l'istruzione di stampa in un file senza modificare alcun codice. Apri semplicemente una finestra del terminale ed esegui il codice in questo modo:

python yourcode.py >> log.txt

11

Questo reindirizzerà l'output di "stampa" a un file:

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

si tratta di patch di scimmia?
Sarath Sadasivan Pillai

6

In Python 3.0+, printè una funzione , che chiameresti con print(...). Nella versione precedente, printè una dichiarazione , che avresti fatto con print ....

Per stampare su un file in Python precedente alla 3.0, dovresti:

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

L' >>operatore indirizza la stampa al file f.


Vorrei stampare un intero array sul file. Se uso il tuo codice, sono state stampate solo la testa e la coda dell'array, come l'output dal terminale. Come stampare tutte le righe dell'array sul file?
Sigur

@Sigur "Come l'output dal terminale" Spiacenti, ma il bug è altrove. Non stai dicendo a Python di stampare l'intera cosa, motivo per cui non lo è.
wizzwizz4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.