Символы конца строки из строк, прочитанных из текстового файла, используя Python - PullRequest
29 голосов
/ 04 декабря 2008

При чтении строк из текстового файла с использованием Python символ конечной строки часто необходимо обрезать перед обработкой текста, как в следующем примере:

f = open("myFile.txt", "r")
for line in f:
    line = line[:-1]
    # do something with line

Есть ли элегантный способ или идиома для извлечения текстовых строк без символа конца строки?

Ответы [ 6 ]

47 голосов
/ 04 декабря 2008

идиоматический способ сделать это в Python - использовать rstrip ('\ n') :

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

У каждой из других альтернатив есть гоча:

  • file ('...'). Read (). Splitlines () должен загрузить весь файл в память сразу.
  • line = line [: - 1] завершится ошибкой, если в последней строке нет EOL.
17 голосов
/ 04 декабря 2008

Simple. Используйте splitline ()

L = open("myFile.txt", "r").read().splitlines();
for line in L: 
    process(line) # this 'line' will not have '\n' character at the end
6 голосов
/ 04 декабря 2008

Что не так с вашим кодом? Я нахожу это довольно элегантным и простым. Единственная проблема состоит в том, что если файл не заканчивается новой строкой, последняя возвращенная строка не будет иметь '\n' в качестве последнего символа, и, следовательно, выполнение line = line[:-1] будет неправильно удалять последний символ строки.

Самый элегантный способ решения этой проблемы - определить генератор, который будет брать строки файла и удалять последний символ из каждой строки, только если этот символ является новой строкой:

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
4 голосов
/ 13 июля 2009

Давным-давно был Дорогой, чистый, старый, бейсик-код, который мог работать на 16-килобайтных компьютерах: вот так:

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

Теперь, чтобы построчно прочитать файл с гораздо лучшим аппаратным и программным обеспечением (Python), мы должны заново изобрести колесо:

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

Я склонен думать, что где-то что-то пошло не так ...

3 голосов
/ 08 августа 2011

Что вы думаете об этом подходе?

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

Выражение генератора позволяет избежать загрузки всего файла в память, а with обеспечивает закрытие файла

2 голосов
/ 04 декабря 2008

Вы можете также рассмотреть возможность использования line.rstrip () для удаления пробелов в конце вашей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...