2011-12-22 6 views
27

Ci sono almeno due modi per scrivere in un file in python:f.write vs stampa >> f

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

o

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

C'è una differenza tra i due? O qualcun altro più Pythonic? Sto cercando di scrivere un po 'di codice HTML per il file, quindi ho bisogno di un sacco di istruzioni di scrittura/stampa attraverso il mio file (ma non ho bisogno di un motore di template).

+3

È pitonico essere esplicito. '.write() 'esprime il tuo intento più chiaramente di' >> ' –

+5

Correggimi se ho torto, ma con le versioni più recenti di Python (3.x) print è una * funzione * (non un costrutto di dichiarazione di sintassi speciale) e quindi il quest'ultimo non funzionerà nemmeno su quelli? (Non ho davvero usato Python da ... 2.6ish.) –

+0

@pst: ottimo punto. Tanto meglio usare il metodo 'write()'. – voithos

risposta

24

print non fa le cose file.write, consentendo di saltare la formattazione della stringa per alcune cose di base.

Inserisce spazi tra gli argomenti e accoda il terminatore di riga.

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

chiama il __str__ o __repr__ metodi speciali di un oggetto per convertirlo in una stringa.

print 1 # prints something like "1\n" 

Si dovrebbe fare manualmente queste cose se si è utilizzato file.write invece di print.

1

La documentazione su print potrebbe aiutare a spiegare questo: print statement (documentazione di Python 2.7).

print, per impostazione predefinita, stampa sullo standard output, che in effetti è un oggetto "tipo file" (sys.stdout). Lo stesso output standard ha un metodo write(). Usare print >> f sembra essere un'astrazione superflua.

Inoltre, sembra troppo prolisso per me. f.write() va bene.

+0

Le newline ('\ n') sono costanti su tutte le piattaforme? Come potrei usare f.write (string + '\ n') e aspettarmi una nuova riga su tutte le piattaforme? – oxuser

+0

Per quanto ne so, si. Python esegue le conversioni per te, di default, anche se questo può essere sovrascritto se lo desideri. – voithos

+0

@agf: si è in errore. Per impostazione predefinita, Python apre i file in modalità "testo" e automatizza la conversione di fine riga durante la scrittura. Devi aggiungere esplicitamente "b" alla modalità di apertura file per averla in modalità binaria, senza conversioni. – jsbueno

1

Come linea di fondo: utilizzare file.write durante la scrittura su file.

L'idioma ">>" per la stampa è stato preso in prestito da C++ all'inizio di Python, ed è piuttosto unpitano - così tanto che non esiste più in Python 3.x - dove si può usare la stampa, ora una funzione invece di una dichiarazione, per scrivere su un file - ma senza una sintassi speciale per quello.

Come punti @agf nella sua risposta, usare "stampa" per scrivere su un file fa più cose che semplicemente chiamando write - chiama automaticamente str (obj) per ottenere una rappresentazione di stringa dell'oggetto, mentre .write richiede che una stringa (byte) viene passata come parametro - nel mondo Python "esplicita è meglio di implicita", quindi un motivo in più per uno per andare con file.write invece.

+3

"Explicit is better than implicit" should not NOT *** leggi come "usa operazioni a basso livello, non astrazioni di livello più alto" !! È la sintassi infallibile della dichiarazione di stampa che è un problema, * non * che raggruppa le operazioni comunemente usate in un pacchetto conveniente. – Ben

1

Questo è il modo preferito, utilizzando i gestori di contesto:

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

su Python 2 preferisco file.write perché la sintassi >> è deprecato. Per python 3 potresti preferire invece usare la funzione di stampa, che dovresti notare fa alcune cose extra (ad esempio converti automaticamente i numeri in stringhe per te, ecc.).

+2

Vero ma non correlato, avresti ancora bisogno di un gestore di contesto con 'print >> f' – Kos

14

Non sono d'accordo con alcune delle opinioni espresse qui, che print >> f è ridondante e dovrebbe essere evitato a favore di f.write.

print e file.write sono operazioni abbastanza diverse. file.write scrive direttamente una stringa in un file. print è più simile a "visualizza valori su stdout come testo". Naturalmente, il risultato del rendering di una stringa come testo è solo la stringa, quindi print >> f, my_string e f.write(my_string) sono quasi intercambiabili (tranne che per l'aggiunta di una nuova riga). Ma la tua scelta tra file.write e print dovrebbe essere basata su quello che stai facendo; stai scrivendo una stringa su un file o stai visualizzando i valori su un file?

Certo, print non è strettamente necessario, in quanto è possibile implementarlo con file.write. Ma allora file.write non è strettamente necessario, perché è possibile implementarlo con le operazioni in os per gestire i descrittori di file. In realtà sono operazioni su diversi livelli e dovresti usare quello che ritieni più appropriato per il tuo utilizzo (normalmente il livello su cui sta lavorando il codice vicino o il livello più alto che non ti intralcia).

Ritengo che la sintassi dello sia piuttosto orribile e rappresenta un ottimo esempio del perché print avrebbe dovuto essere una funzione per tutto il tempo. Questo è molto migliorato in Python 3. Ma anche se stai scrivendo il codice Python 2 che hai intenzione di eseguire il porting su Python 3, è molto più facile convertire print >> f, thing1, thing2, thing3, ... in print(thing1, thing2, thing3, file=f) piuttosto che convertire la circonlocuzione in cui rotoli il tuo codice per fare l'equivalente del rendering di print e quindi chiamare f.write(text). Sono abbastanza sicuro che il convertitore semiautomatico da Python 2 a Python 3 farà anche la conversione per te, cosa che non potrebbe fare se si evita il modulo print >> f.

Riga inferiore: utilizzare print per eseguire il rendering dei valori su stdout (o su un file). Utilizzare f.write per scrivere testo in un file.

2

concordare con @agf

ho preferito print(..., file=f) causa della sua flessibilità.

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

E 'anche facile da convertire print comando esistente.

write accetta solo stringa.

3

Non dovresti fare nessuna di quelle cose. La cosa più Pythonic da fare è utilizzare la funzione di stampa Python 3 (in contrasto con il Python 2 stampa dichiarazione):

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

Naturalmente il modo ideale per farlo è di utilizzare solo Python 3. Ma se sei bloccato utilizzando Python 2 è possibile accenderlo utilizzando un future statement nella parte superiore del file:

from __future__ import print_function 

si noti che questo cambia di stampa in altri modi, il più evidente in quanto è necessario aggiungere parentesi attorno ai suoi argomenti . Ma i cambiamenti sono tutti miglioramenti, che è l'intera ragione del cambiamento in Python 3. Mentre ci sei, considera l'utilizzo di tutte le dichiarazioni future per ottenere il maggior numero di miglioramenti da backport da Python 3 possibile.