Python中的readlines未读取文件的最后一行
我有一段代码,它通过readlines函数读取文件中的所有行,然后把每一行放到一个列表里。但是当我打印这个列表时,我发现循环忽略了文件的最后一行。当我在文件里插入一个空行后,所有内容都能被读取。你能告诉我为什么会这样吗?
def readFile1(file1):
f = file1.readlines()
cList1 = []
for line in f:
if re.findall('\n',line):
v = re.sub('\n','',line)
cList1.append(v)
print cList1
这段代码打印了文件中的所有内容,除了最后一行。
4 个回答
0
print f
实际上会打印所有的行。这是你代码中的一个错误。你把倒数第二行加了两次,因为最后一行没有包含 \n
(换行符)。你缺少一个 else
语句块,用来在没有 \n
的情况下给 v
赋值。
1
如果你只是想把文件里的所有行都放到一个列表里,其实有一种更简单(我觉得也更干净)的做法。
def readFile1(file1):
cList1 = file1.read().splitlines()
print cList1
在这种情况下,我觉得没有必要使用生成器。而且我在Windows上测试过,@aix提供的生成器方式在某些情况下稍微慢一点。
>>> import timeit
>>> import os
>>>
>>> # Setup
>>> open('testfile', 'w').write('This Is A Test' * 500)
>>>
>>> # Time generator form (ten thousand times)
>>> timeit.timeit("lst = [line.rstrip('\\n') for line in open('testfile')]",
... number=10000)
2.656837282256163
>>>
>>> # Time splitlines() form (ten thousand times)
>>> timeit.timeit("lst = open('testfile').read().splitlines()", number=10000)
1.3464799954204238
>>>
>>> # Cleanup
>>> os.remove('testfile')
11
如果最后一行没有以换行符结束,你的代码就不会把它加到 cList1
里。相反,它会把倒数第二行再加一遍(因为倒数第二行还保存在 v
里)。
写这个循环的更简洁的方法是:
cList1 = []
for line in f:
cList1.append(line.rstrip('\n'))
或者,实际上:
cList1 = [line.rstrip('\n') for line in f]
其实,我会完全避免使用 readlines()
这个调用:
def readFile1(file1):
cList1 = [line.rstrip('\n') for line in file1]
print cList1