2013-08-03 9 views

risposta

12

print aggiunge un newline, e le linee di ingresso già terminare con una nuova riga.

Una soluzione standard è di uscita delle linee di ingresso integrali:

import sys 

with open("a.txt") as f: 
    for line in f: 
     sys.stdout.write(line) 

PS: Per Python 3 (o Python 2 con la funzione di stampa), soluzione di abarnert print(…, end='') è la più semplice.

+0

L'OP sta chiaramente usando Python 2, e non sono sicuro che suggerire "print_function" per gli utenti 2.x sia sempre una buona idea. E usare lo spazio morbido magico di 'print' è probabilmente una cattiva idea se non si impara prima cosa significa e come funziona. Il che significa che la tua "scrittura" esplicita potrebbe essere la migliore risposta (motivo per cui ho rilanciato la tua risposta, e penso che l'OP abbia ragione ad accettarlo). – abarnert

+0

REF https://docs.python.org/2/library/functions.html#print –

0

Non aggiunge una nuova riga, ma ogni riga scansionata dal file ha una riga finale.

Prova:

with open ("a.txt") as f: 
    for line in (x.rstrip ('\n') for x in f): 
     print line 
+0

Questo errore su Windows (o Mac OS prima di OS X), perché il carattere di nuova riga non è '\ n'. – EOL

+1

Anche questo non riesce se il file a.txt non esiste. – Hyperboreus

+1

@EOL AFAIK, e potrei sbagliarmi, i file aperti in text-mode in python hanno tutte le loro terminazioni di riga convertite implicitamente in \ n '. – Hyperboreus

2

Quello che succede è che ogni riga come una nuova riga alla fine, e print dichiarazione in pitone aggiunge anche una nuova riga. È possibile sottrarre alle nuove righe:

with open("a.txt") as f: 
    for line in f: 
     print line.strip() 
+0

'strip '()' rimuove anche gli spazi bianchi iniziali, quindi questa soluzione non stampa correttamente il file di input quando contiene linee che iniziano con spazi. In realtà vuoi 'rstrip()'. Anche 'rstrip()' non è così buono: rimuove le newline (che è buono), ma anche gli spazi finali, che modificano le linee del file di input in qualche modo indesiderato, quindi anche una versione 'rstrip()' non fare completamente ciò che è necessario. – EOL

1

si potrebbe anche provare la funzione splitlines(), le strisce automaticamente:

f = open('a.txt').read() 
for l in f.splitlines(): 
    print l 
+1

Anche se questo gestisce correttamente i vari congressi a capo di più sistemi operativi, sia in Python 2 e Python 3 questa soluzione può prendere un sacco di memoria : non solo l'intero file viene letto in memoria, ma una copia viene fatta attraverso l'elenco delle sue linee. Quindi, questo è un metodo che funziona, ma solo per i file che non sono troppo grandi.Nota che la memoria verrebbe alla fine liberata se questa soluzione usasse un 'with', come in altre risposte. – EOL

+0

@EOL: Il 'with' non influenzerà la liberazione della memoria. Sia che chiudi il file o no, la stringa 'f' gigante è in diretta per la stessa quantità di tempo in entrambi i casi. (Naturalmente è comunque una buona idea non perdere gli handle di file. Non è rilevante per GC'ing 'f', o' f.splitlines'.) – abarnert

+0

@abarnert: hai ragione. Non sono sicuro del motivo per cui ho scritto che la memoria sarebbe stata liberata con 'with' (la quantità di memoria coinvolta è davvero trascurabile). – EOL

6

Come le altre risposte spiegano, ogni linea ha un ritorno a capo; quando si print una stringa nuda, si aggiunge una linea alla fine. Ci sono due modi per aggirare questo; tutto il resto è una variazione delle stesse due idee.


In primo luogo, si può spogliare le nuove righe come li si legge:

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip() 

Questo eliminerà qualsiasi altro spazio bianco in coda, come spazi o tabulazioni, così come il ritorno a capo. Di solito non ti importa di questo. Se lo fai, probabilmente si desidera utilizzare la modalità a capo universale, e togliere i ritorni a capo:

with open("a.txt", "rU") as f: 
    for line in f: 
     print line.rstrip('\n') 

Tuttavia, se si conosce il file di testo sarà, ad esempio, un file di Windows-ritorno a capo, o un nativo-to -whichever-platform-sto-running-on-destra-ora-a capo di file, è possibile striscia terminazioni appropriate in modo esplicito:

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip('\r\n') 

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip(os.linesep) 

l'altro modo per farlo è quello di lasciare il ritorno a capo originale e basta evitare di stamparne uno in più. Mentre puoi farlo scrivendo a sys.stdout con sys.stdout.write(line), puoi anche farlo da print stesso.

Se si aggiunge una virgola alla fine dell'istruzione print, anziché stampare una nuova riga, viene aggiunto uno "spazio intelligente". Exactly what that means è un po 'complicato, ma l'idea dovrebbe essere che aggiunge uno spazio quando dovrebbe, e nulla quando non dovrebbe. Come la maggior parte algoritmi DWIM, non sempre ottiene le cose a posto, ma in questo caso, lo fa:

with open("a.txt") as f: 
    for line in f: 
     print line, 

Naturalmente Stiamo assumendo che a capo del file corrispondono ai suoi terminal's-se si tenta questo con, diciamo, i classici file Mac su un terminale Unix, finirai per stampare ogni riga sull'ultimo. Di nuovo, puoi aggirare questo usando le newline universali.

Ad ogni modo, è possibile evitare la magia DWIM di spazio intelligente utilizzando la funzione di stampa invece che l'istruzione print. In Python 2.x, si ottiene questo utilizzando una dichiarazione __future__:

from __future__ import print_function 
with open("a.txt") as f: 
    for line in f: 
     print(line, end='') 

In alternativa è possibile utilizzare una libreria wrapper di terze parti come six, se si preferisce.

+0

stripping '\ r' è inutile perché hai aperto il file in modalità testo: il' \ r' carattere viene rimosso _prima_ devi strapparlo. Utile solo con python 2 e modalità binaria per file di testo (non compatibile con python 3) –

Problemi correlati