readlines没有在python中读取文件的最后一行

时间:2012-01-17 20:37:38

标签: python

我有一个代码,我正在使用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 :(得分: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

答案 1 :(得分: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')

答案 2 :(得分:0)

您的最后一行没有\ n字符,因为您之后没有新行。

答案 3 :(得分:0)

print f实际打印所有行。这是你代码中的一个错误。您将倒数第二行附加两次,因为最后一行不包含\n。你错过了,例如一个else块,在v不包含\n时分配{{1}}。