Python中的readlines未读取文件的最后一行

2 投票
4 回答
7554 浏览
提问于 2025-04-17 10:28

我有一段代码,它通过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

撰写回答