2010-10-23 15 views
5

Mam plik czytam niż wygląda:Zignoruj ​​ostatniego n podczas korzystania readlines z pytona

1 value1 
2 value2 
3 value3 

Plik może lub nie może mieć trailing \ n, w ostatnim wierszu.

Kod, którego używam działa świetnie, ale jeśli istnieje \ n kończy się niepowodzeniem.
Jaki jest najlepszy sposób, aby to złapać?

Mój kod dla odniesienia:

r=open(sys.argv[1], 'r'); 
for line in r.readlines(): 
    ref=line.split(); 
    print ref[0], ref[1] 

Które nie z:
Traceback (najnowszego połączenia ostatniego):
pliku "./test", linia 14, w
druku [ref 0], nr [1]
IndexError: lista indeks poza zasięgiem

Odpowiedz

7

można zignorować wiersze zawierające tylko spacje:

for line in r.readlines(): 
    line = line.rstrip()  # Remove trailing whitespace. 
    if line:     # Only process non-empty lines. 
     ref = line.split(); 
     print ref[0], ref[1] 
+1

rstrip jest zbędny; split ignoruje wiodące/szkoleniowe białe znaki –

2

Nie sądzę, że opowiedziałeś nam całą historię. line.split() da taki sam wynik, niezależnie od tego, czy ostatnia linia zostanie zakończona przez \n, czy też nie.

Należy zauważyć, że ostatnia linia w pliku kończącym się przez \n jest zachowaniem USUAL, a ludzie są czasami zaniepokojeni wierszem, który nie jest tak zakończony.

Jeśli było zrobić coś takiego:

print repr(line), repr(ref) 

zamiast

print ref[0], ref[1] 

byłbyś w stanie wykryć dla siebie dokładnie to, co się dzieje, zamiast pozostawiając nas do odgadnięcia.

Jeśli tak przypuszcza @Mark Byers, Twoja ostatnia linia jest pusta lub składa się wyłącznie z białych znaków, można zignorować tę linię (i wszystkie inne tego typu linie) przez to nieco bardziej prostego kodu:

for line in r: # readlines is passe 
    ref = line.split() # split() ignores trailing whitespace 
    if ref: 
     print ref[0], ref[1] 

proszę rozważ także możliwość, że w ostatniej linii masz tylko jedno pole, a nie 0 lub 2.

+0

Myślę, że miał na myśli, że istnieje jeszcze jedna linia, składająca się tylko z '\ n', na końcu ... (plik kończący się na" ... wartość3 \ n \ n ") – Steven

Powiązane problemy