使用python从文本文件中读取行时,通常需要在处理文本之前截断行尾字符,如下例所示:
f = open("myFile.txt", "r")
for line in f:
line = line[:-1]
# do something with line
是否有一种优雅的方式或习惯用于检索没有结束字符的文本行?
答案 0 :(得分:47)
在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)
其他每个选择都有一个问题:
答案 1 :(得分:17)
简单。使用 splitlines()
L = open("myFile.txt", "r").read().splitlines();
for line in L:
process(line) # this 'line' will not have '\n' character at the end
答案 2 :(得分:6)
您的代码有什么问题?我发现它非常优雅和简单。唯一的问题是,如果文件没有以换行符结尾,则返回的最后一行将不会有'\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
答案 3 :(得分:4)
很久以前,有可以在16 kb核心机器上运行的Dear,clean,old,BASIC代码: 那样:
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
我被诱导认为某些地方出现了错误的方式......
答案 4 :(得分:3)
你对这种方法有什么看法?
with open(filename) as data:
datalines = (line.rstrip('\r\n') for line in data)
for line in datalines:
...do something awesome...
生成器表达式避免将整个文件加载到内存中,with
确保关闭文件
答案 5 :(得分:2)
您也可以考虑使用line.rstrip()删除行尾的空格。