2013-08-03 14 views

Odpowiedz

12

print dołącza do nowej linii, a linie wejściowe już kończyć nową linią.

Standardowe rozwiązanie do wyjścia linii wejściowych verbatim:

import sys 

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

PS: Pythona 3 (lub Pythonie 2 przy drukowaniu) print(…, end='') roztwór abarnert jest najprostsza.

+0

OP wyraźnie wykorzystuje Python 2 i nie jestem pewien, czy sugerowanie 'print_function' dla użytkowników 2.x jest zawsze dobrym pomysłem. Używanie magicznej miękkiej przestrzeni 'print' jest prawdopodobnie złym pomysłem, jeśli najpierw nie dowiesz się, co to znaczy i jak działa. Co oznacza, że ​​twoje jednoznaczne "pisanie" może być najlepszą odpowiedzią (dlatego też przegłosowałem twoją odpowiedź i uważam, że PO miał rację, aby ją zaakceptować). – abarnert

+0

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

0

Nie dodaje nowej linii, ale każda zeskanowana linia z pliku ma końcową.

Spróbuj:

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

Ta operacja nie powiedzie się w systemie Windows (lub Mac OS przed systemem OS X), ponieważ znak nowej linii nie jest '\ n'. – EOL

+1

To również nie działa, jeśli plik a.txt nie istnieje. – Hyperboreus

+1

@EOL AFAIK, a może się mylę, pliki otwierane w trybie tekstowym w pythonie mają wszystkie ich zakończenia liniowe implicitely zamienione na '\ n'. – Hyperboreus

2

Co się dzieje, jest to, że każda linia w nowej linii na końcu, a print oświadczenie w Pythonie dodaje również przełamane. Można pozbawić nowe linie:

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

'strip()' również usuwa wiodące białe spacje, więc to rozwiązanie nie poprawnie wydrukuje plik wejściowy, gdy zawiera linie zaczynające się spacjami. Tak naprawdę potrzebujesz 'rstrip()'. Nawet 'rstrip()' nie jest zbyt dobry: usuwa nowe linie (co jest dobre), ale także końcowe spacje, które modyfikują linie pliku wejściowego w jakiś możliwy sposób, więc nawet wersja 'rstrip()' nie w pełni rób to, co jest potrzebne. – EOL

1

Można również spróbować funkcję splitlines(), to pozbawia się automatycznie:

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

Chociaż poprawnie obsługuje różne konwencje newline wielu systemów operacyjnych, zarówno w Pythonie 2, jak i Pythonie 3 rozwiązanie to może zająć dużo pamięci : nie tylko cały plik jest odczytywany w pamięci, ale kopia jest wykonywana poprzez listę jego linii. Tak więc jest to metoda, która działa, ale tylko dla plików, które nie są zbyt duże.Pamiętaj, że pamięć zostanie ostatecznie zwolniona, jeśli to rozwiązanie użyje 'z', jak w niektórych innych odpowiedziach. – EOL

+0

@EOL: 'z' nie wpłynie na zwolnienie pamięci. Niezależnie od tego, czy plik zostanie zamknięty, czy nie, gigantyczny ciąg 'f' jest wyświetlany na żywo dokładnie w tym samym czasie. (Oczywiście nadal dobrze jest nie przeciekać uchwytów plików, nie ma to znaczenia dla GC'ing 'f' lub' f.splitlines'.) – abarnert

+0

@abarnert: Masz rację. Nie jestem pewien, dlaczego napisałem, że pamięć zostanie zwolniona z 'with' (zaangażowana ilość pamięci jest rzeczywiście znikoma). – EOL

6

jak inne odpowiedzi wyjaśnić, każda linia ma przełamane; gdy masz print pusty ciąg, dodaje on na końcu linię. Są na to dwa sposoby; wszystko inne jest odmianą tych samych dwóch pomysłów.


Po pierwsze, można rozebrać te znaki nowej linii, jak je czytać:

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

To usunie wszelkie inne spacje z tyłu, jak spacje lub kartach, a także nowej linii. Zwykle nie przejmujesz się tym. Jeśli tak, prawdopodobnie chcesz użyć trybu nowej linii powszechnej, i zdejmować te nowe linie:

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

Jednakże, jeśli wiesz, że plik tekstowy będzie, powiedzmy, Windows nowalinia plik lub native-do -whichever-platform-jestem-running-na-prawo-teraz-nowego wiersza pliku, można rozebrać odpowiednich zakończeń wyraźnie:

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) 

Innym sposobem, aby to zrobić jest pozostawienie oryginalnego przełamane , i po prostu unikaj drukowania dodatkowego. Możesz to zrobić, pisząc do sys.stdout z sys.stdout.write(line), możesz to zrobić również z poziomu print.

Jeśli po prostu dodasz przecinek na końcu instrukcji print, zamiast drukować znak nowej linii, dodaje on "inteligentną przestrzeń". Exactly what that means jest nieco skomplikowany, ale pomysł ma polegać na tym, że dodaje przestrzeń, kiedy powinien, i nic, gdy nie powinien. Jak większość algorytmów DWIM, nie zawsze się to dobrze, ale w tym przypadku, to robi:

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

Oczywiście jesteśmy teraz przy założeniu, że nowe linie pliku za dopasować terminal's-jeśli spróbujesz to z, powiedzmy, klasyczne pliki Mac na terminalu Unix, skończysz z każdym drukowaniem linii na ostatnim. Znowu możesz obejść to, używając uniwersalnych znaków nowej linii.

W każdym razie możesz uniknąć magii DWIM inteligentnej przestrzeni, używając funkcji drukowania zamiast instrukcji print. W Pythonie 2.x, dostajesz to za pomocą deklaracji __future__:

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

Albo można użyć biblioteki otoki firm trzecich jak six, jeśli wolisz.

+0

usuwanie '\ r' jest bezużyteczne, ponieważ otworzyłeś plik w trybie tekstowym: znak' \ r' został usunięty _ przedtem musisz go rozebrać. Przydatne tylko w Pythonie 2 i trybie binarnym dla plików tekstowych (nie kompatybilne z pythonem 3) –

Powiązane problemy