我有一个代码,我正在使用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
这是打印除文件最后一行以外的所有内容。
答案 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}}。