Python è l’aggiunta di extra newline per l’uscita

Il file di input: a.txt

aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc

Il codice python:

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

Il problema:

[[email protected] 0]# python read_lines.wsgi
aaaaaaaaaaaa

bbbbbbbbbbb

cccccccccccc

come si può vedere l’output ha una linea tra ogni elemento.

Come evitare questo?

InformationsquelleAutor | 2013-08-03

 

5 Replies
  1. 16

    print aggiunge un ritorno a capo, e le linee di ingresso già con un carattere di nuova riga.

    Una soluzione standard output input testualmente:

    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), abarnert del print(…, end='') soluzione è la più semplice.

    • L’OP è chiaramente usando Python 2, e non sto certo suggerendo print_function per 2.x gli utenti è sempre una buona idea. E l’utilizzo di print‘s magic soft spazio è probabilmente una cattiva idea se non prima imparare cosa significa e come funziona. Il che significa che il vostro esplicito write può essere la migliore risposta (che è il motivo per cui io con voto positivo la tua risposta, e penso che la OP è giusto accettarlo).
    • RIF docs.python.org/2/library/functions.html#print
  2. 7

    Come le altre risposte spiegare, ogni linea ha un carattere di newline; quando si print nuda stringa, aggiunge una riga alla fine. Ci sono due modi per aggirare questo, tutto il resto è una variazione su due idee.


    Prima, si può togliere il punto e a capo come li si legge:

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

    Questo eliminerà qualsiasi altra finali spazi, spazi o tabulazioni, così come il carattere di nuova riga. Di solito non si preoccupano di questo. Se si, si probabilmente desidera utilizzare universale newline modalità, e togliere il punto e 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à, diciamo, un Windows-newline file, o un nativo-per-qualsiasi-piattaforma-sto-running-su-destra-ora-newline file, è possibile rimuovere le opportune terminazioni esplicitamente:

    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)

    Altro modo per farlo è quello di lasciare l’originale newline, ed evitare la stampa di un extra. Mentre è possibile farlo scrivendo a sys.stdout con sys.stdout.write(line), si può anche fare da print stesso.

    Se si aggiunge solo una virgola alla fine del print istruzione, invece di stampare un carattere di newline, si aggiunge una “smart space”. Esattamente quello che significa è un po ‘ difficile, ma l’idea dovrebbe essere che aggiunge uno spazio quando si deve, e nulla quando non dovrebbe. Come la maggior parte DWIM algoritmi, non sempre ottenere le cose giuste—ma in questo caso, lo fa:

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

    Naturalmente ora stiamo supponendo che il file è a capo, abbinare il vostro terminale—se si tenta questo, ad esempio, il classico Mac i file su un terminale Unix, vi ritroverete con ogni riga di stampa negli ultimi. Di nuovo, si può andare in giro che utilizzando universal punto e a capo.

    Comunque, è possibile evitare il DWIM magia di smart spazio utilizzando la funzione di stampa anziché l’istruzione print. In Python 2.x, si ottiene utilizzando un __future__ dichiarazione:

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

    O è possibile utilizzare un terzo wrapper biblioteca come six, se si preferisce.

    • stripping \r è inutile perché hai aperto il file in modalità testo: il \r char viene rimosso prima devi striscia. Utile solo con python 2 e la modalità binaria per i file di testo (non compatibile con python 3)
  3. 2

    Quello che succede è che ogni riga come un carattere di nuova riga alla fine, e print istruzione in python, inoltre, aggiunge una nuova riga. Si può togliere il punto e a capo:

    with open("a.txt") as f:
        for line in f:
            print line.strip()
    • strip() rimuove spazi vuoti iniziali troppo, quindi questa soluzione non riesce a stampare correttamente il file di input che contiene le linee che iniziano con spazi. Effettivamente rstrip(). Anche rstrip() non è così buono: rimuove i ritorni a capo (che è buono), ma anche gli spazi finali, che modifica le righe del file di input in alcuni indesiderati, in modo anche un rstrip() versione non completamente a fare ciò che è necessario.
  4. 1

    Si potrebbe anche provare il splitlines() funzione, esso elimina automaticamente:

    f = open('a.txt').read()
    for l in f.splitlines():
        print l
    • Mentre questo gestisce correttamente i vari newline convention di più sistemi operativi, sia in Python 2 e Python 3 questa soluzione può prendere un sacco di memoria: non solo è tutta la lettura di file in memoria, ma una copia è fatta attraverso la lista delle linee. Quindi, questo è un metodo che funziona, ma solo per i file che non sono troppo grandi. Notare che la memoria finirebbe per essere liberato se questa soluzione utilizzata una with, come in alcune altre risposte.
    • Il with non compromette la di liberare la memoria. Se si chiude il file o non, il gigante f stringa è vivere esattamente per la stessa quantità di tempo in entrambi i modi. (Naturalmente è ancora una buona idea di non perdita di handle di file. Non è rilevante per GC ing f, o f.splitlines.)
    • Hai ragione. Non so perché ho scritto che la memoria sarebbe liberato con with (coinvolti quantità di memoria è davvero trascurabile).
  5. 0

    Non è l’aggiunta di una nuova riga, ma ogni riga digitalizzata dal file ha un trailing uno.

    Provare:

    with open ("a.txt") as f:
        for line in (x.rstrip ('\n') for x in f):
            print line
    • Questo non funziona in Windows (o Mac OS prima di OS X), perché il carattere non è \n.
    • Questo non funziona anche se il file a.txt non esiste.
    • Per quanto ne so, e posso sbagliarmi, i file aperti in modalità di testo in python hanno tutti la loro fine riga implicitamente convertito a ‘\n’.
    • Si può semplicemente for line in f: print(line.rstrip()), oppure è possibile utilizzare os.linesep se si vuole essere precisi.
    • Solo se hai letto il file in rU modalità.
    • Stranamente, ho appena imbattuto su Windows7 e ha funzionato come previsto. Senza ‘rU’, il codice esatto, come inviato.
    • Questo è probabilmente perché il \r personaggio tenuto dalla tua rstrip() non ha alcun effetto visibile qui (immagino che mette il cursore all’inizio della riga). Credo che si può vedere la differenza tra le due modalità di apertura del file da stampa repr(line[-1]): mi aspetto che sia \r, nella modalità predefinita in Windows (e l’ultimo non-carattere di ” a capo della linea universale newline modalità).
    • La stampa [ord (x) per x in linea] mostra n \r personaggio a tutti.
    • Nella mia esperienza, il codice che funziona su più piattaforme senza molto sforzo è un modo molto migliore di codifica di un determinato compito, perché utilizza gli strumenti che sono progettati per eseguire correttamente il compito a portata di mano, rispetto al codice specifico per la piattaforma che più ha modificato una soluzione parziale che mancano alcuni concetti importanti (come il fatto che i diversi Sistemi operativi utilizzano diversi newline convenzioni).
    • Sembra che il tuo file non è un file di testo Windows. Un file di testo Windows dovrebbe \r\n alla fine di ogni riga. La documentazione è piuttosto espliciti \r\n essere tenuti in quanto è la modalità di default (docs.python.org/2/library/functions.html#open).

Lascia un commento