2008-12-04 10 views

Odpowiedz

44

idiomatyczne sposób to zrobić w Pythonie jest użycie rstrip ('\ n'):

for line in open('myfile.txt'): # opened in text-mode; all EOLs are converted to '\n' 
    line = line.rstrip('\n') 
    process(line) 

Każdy z pozostałych alternatyw ma Gotcha:

  • plik ("..."). read(). splitlines() musi załadować cały plik w pamięci naraz.
  • line = line [: - 1] zawiedzie, jeśli ostatnia linia nie ma EOL.
+15

HTTP i inne protokoły określają '\ r \ n' dla końcówek linii, więc powinieneś użyć linii.rstrip ('\ r \ n') dla solidności. –

+0

Dzięki za pomoc! Musiałem otworzyć plik tekstowy i byłem zdumiony widząc, że \ n-rzeczy jest nawet w Pythonie, jak to jest w Perlu, C i wielu innych językach. Zakładam to i nigdy tego nie zapomnę. – bjd2385

5

Co jest nie tak z twoim kodem? Uważam, że jest dość elegancki i prosty. Jedyny problem polega na tym, że jeśli plik nie kończy się znakiem nowej linii, ostatni zwrócony wiersz nie będzie miał znaku '\n' jako ostatniego znaku, a zatem wykonanie line = line[:-1] spowoduje niepoprawne usunięcie ostatniego znaku linii.

Najbardziej eleganckim sposobem rozwiązania tego problemu byłoby określenie generator które podjęło linie pliku i usuwa ostatni znak z każdej linii tylko wtedy, gdy znak jest znak nowej linii:

def strip_trailing_newlines(file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line in strip_trailing_newlines(f): 
    # do something with line 
+3

plików Mac używając '\ r', Windows wykorzystuje '\ r \ n', zaczyna się masywny. Znacznie lepiej jest użyć str.rstrip() –

+2

Jeśli plik zostanie otwarty w trybie tekstowym, jego natywne zakończenia liniowe są automatycznie konwertowane do pojedynczego "\ n", ponieważ są one odczytywane. I tylko _nie stary stary Mac OS używa zwykłego "\ r ". Nie możesz użyć rstrip(), jeśli chcesz zachować końcowe spacje i tabulatory. –

+0

Dobry pomysł, z generatorem. Byłby przydatny w bibliotece wielokrotnego użytku. Chciałbym połączyć twoje rozwiązanie z rozwiązaniem efonitis (aby zapisać if: else :). Bez dostępnej biblioteki wielokrotnego użytku wolałbym rozwiązanie efotinis (używając line.rstrip ('\ n')). – pythonquick

17

proste. Użyj splitlines()

L = open("myFile.txt", "r").read().splitlines(); 
for line in L: 
    process(line) # this 'line' will not have '\n' character at the end 
+4

Ale pamiętaj, że najpierw wczytywany jest cały plik do pamięci, co może sprawić, że będzie on nieodpowiedni w niektórych sytuacjach. –

+0

@ Mathew: Tak, masz rację. –

+1

czyni to dokładnie dla mnie, dzięki –

2

Można również rozważyć użycie line.rstrip(), aby usunąć spacje na końcu linii.

+0

Używam również rstrip(), ale trzeba pamiętać, że również usuwa spacje i tabulatory –

+0

Jak pokazał efotinis, jeśli podasz argument chars, możesz sprecyzować co rozebrać się. Z dokumentacji: "" "rstrip ([chars]) Argument chars jest łańcuchem znaków określającym zestaw znaków do usunięcia.Jeśli pominięto lub None, argument chars domyślnie usuwa białe znaki." "" – monkut

3

Dawno temu, nie było Drogi, czyste, stare, kod BASIC, który mógłby pracować na podstawowych maszyn 16 KB: takiego:

if (not open(1,"file.txt")) error "Could not open 'file.txt' for reading" 
while(not eof(1)) 
    line input #1 a$ 
    print a$ 
wend 
close 

Teraz odczytać pliku linia po linii, ze znacznie lepszego sprzętu i oprogramowania (Python), musimy wyważać otwartych drzwi:

def line_input (file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line_input(f): 
    # do something with line 

ja indukowane myśleć, że coś poszło wspak gdzieś ...

+1

Chociaż, biorąc pod uwagę, że python jest naszą najlepszą opcją dla języka interpretowanego na poziomie wpisu, zgadzam się z tym komentarzem, może być wygodnie zauważyć, że 16kb BASIC ze zdaniem WHILE nigdy nie były powszechne. – arivero

3

Co sądzisz o tym podejściu?

with open(filename) as data: 
    datalines = (line.rstrip('\r\n') for line in data) 
    for line in datalines: 
     ...do something awesome... 

wyrażenie Generator unika ładuje cały plik do pamięci i with zapewnia zamykania pliku

Powiązane problemy