Python:检测当前读取的文件行是否为最后一行
我在用Python逐行读取一个文件,想知道在读取的时候,哪一行是最后一行,类似这样的需求:
f = open("myfile.txt")
for line in f:
if line is lastline:
#do smth
我在一些例子中发现,通常需要使用寻址和完整读取文件来计算行数等等。那我能不能直接判断当前这一行就是最后一行呢?我试着去检查是否有"\n"这个符号,但在很多情况下,最后一行后面并没有这个符号。
如果我的问题重复了,我很抱歉,因为我在Stack Overflow上没有找到答案。
8 个回答
2
这是一个老问题,但如果你想允许最后一行是空的,这个方法更好:
with open("myfile.txt") as f:
while True:
line = f.readline()
# do smth
if line[-1:] != '\n':
# do smth with the last line
break
或者更容易读懂:
with open("myfile.txt") as f:
while True:
line = f.readline()
# do smth
if not line.endswith('\n'):
# do smth with the last line
break
2
你可以试试获取下一行内容,如果出现错误就捕捉这个错误。因为据我所知,Python 的迭代器没有内置的 hasNext 方法。
9
import os
path = 'myfile.txt'
size = os.path.getsize(path)
with open(path) as f:
for line in f:
size -= len(line)
if not size:
print('this is the last line')
print(line)
这里有一个替代方案,适合处理非常大的文件,因为这样的文件遍历起来可能会很慢。这个方法是从文件的末尾开始,反向读取文件,使用了seek
这个功能。它假设文件不是二进制格式,也没有被压缩,并且至少有一个换行符,而且最后一个字符是换行符。
import os
path = 'myfile.txt'
size = os.path.getsize(path)
with open(path) as f:
for i in range(1, size):
f.seek(size - 1 - i)
if f.read(1) == '\n':
print('This is the last line.:')
last_line = f.read()
print(last_line)
break
9
检查这一行是否是最后一行:
with open("in.txt") as f:
lines = f.readlines()
last = lines[-1]
for line in lines:
if line is last:
print id(line),id(last)
# do work on lst line
else:
# work on other lines
如果你想要倒数第二行,可以用 last = lines[-2]
或者直接这样:
with open("in.txt") as f:
lines = f.readlines()
last = lines[-1]
for line in lines[:-1]:
# work on all but last line
# work on last
3
在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案。在这些论坛上,很多人会分享他们的经验和解决办法,帮助其他人解决类似的问题。
当你在这些论坛上提问时,记得描述清楚你遇到的问题,包括你使用的编程语言、你写的代码、以及你希望实现的目标。这样,其他人才能更好地理解你的问题,并给出有效的建议。
同时,查看别人提问和回答的问题也是一个很好的学习方式。你可以看到不同的解决方案,了解更多的编程技巧和知识。
总之,技术论坛是一个很好的资源,可以帮助你解决编程中的难题,提升你的技能。
secondLastLine = None
lastLine = None
with open("myfile.txt") as infile:
secondLastLine, lastLine = infile.readline(), infile.readline()
for line in infile:
# do stuff
secondLastLine = lastLine
lastLine = line
# do stuff with secondLastLine