Конечные символы из строк, считанных из текстового файла, с использованием Python

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

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

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

Ответ 1

Идиоматическим способом сделать это в 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)

Каждая из других альтернатив имеет getcha:

  • файл ('...'). read(). splitlines() должен сразу загрузить весь файл в памяти.
  • line = line [: - 1] не удастся, если в последней строке нет EOL.

Ответ 2

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

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

Ответ 3

Что не так с вашим кодом? Я считаю, что это довольно элегантно и просто. Единственная проблема заключается в том, что если файл не заканчивается в новой строке, последняя возвращаемая строка не будет иметь '\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

Давным-давно, был Дорогой, чистый, старый, код BASIC, который мог работать на ядрах 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

Я вынужден думать, что что-то пошло не так, как только...

Ответ 5

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

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

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

Ответ 6

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