Конечные символы из строк, считанных из текстового файла, с использованием 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(), чтобы удалить пробелы в конце строки.