Игнорировать последний \ n при использовании readlines с python - PullRequest
6 голосов
/ 24 октября 2010

У меня есть файл, из которого я читаю, который выглядит следующим образом:

1   value1
2   value2
3   value3

Файл может иметь или не иметь завершающий символ \ n в последней строке.

КодИспользование отлично работает, но если есть трейлинг \ n, он не работает.
Каков лучший способ поймать это?

Мой код для справки:

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

Что не получится сa:
Traceback (последний вызов был последним):
Файл "./test", строка 14, в
print ref [0], ref [1]
IndexError: индекс списка вне диапазона

Ответы [ 2 ]

8 голосов
/ 24 октября 2010

Вы можете игнорировать строки, содержащие только пробелы:

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]
2 голосов
/ 24 октября 2010

Не думаю, что вы рассказали нам всю историю. line.split() даст тот же результат независимо от того, завершится ли последняя строка \n или нет.

Обратите внимание, что последняя строка в файле, оканчивающаяся на \n, - это ОБЫЧНОЕ поведение, и людям иногда мешает строка, которая не так оканчивается.

Если бы вы сделали что-то вроде:

print repr(line), repr(ref)

вместо

print ref[0], ref[1]

Вы сможете точно определить, что происходит, вместо того, чтобы угадывать нас.

Если, как предполагает @Mark Byers, ваша последняя строка пуста или состоит только из пробелов, вы можете игнорировать эту строку (и все другие подобные строки) с помощью этого несколько более простого кода:

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

Также учтите, что в вашей последней строке может быть только одно поле, а не 0 или 2.

...