我想知道是否有一种简单的方法可以打开文件的倒数第二行。 f.seek给了我无尽的麻烦。我可以很容易地进入最后一线,但我无法弄清楚如何达到上面的线。打印到文件的倒数第二行
1
A
回答
3
假设该文件不是太大,内存是不是一个问题
open('file.txt').readlines()[-2]
1
def penultimate(file_path)
return open(file_path).read().splitlines()[len(open(file_path).read().splitlines()) - 2]
2
您可以从文件末尾寻求并计算遇到的新行的数量,只要你打第二'\n'
停止,并呼吁readline()
:
with open('foo.txt') as f:
end_count = 0
n = -1
while end_count != 2:
f.seek(n, 2)
if f.read(1) == '\n':
end_count += 1
n -= 1
print repr(f.readline())
对于这样一个文件:
first line
second line
third line
fourth line
I want this line
last line
的输出将是:
'I want this line\n'
2
文件是字节在大多数系统的单个长串(一些具有叉,盘区或记录),留下线的概念,以更高的水平。更复杂的是,在所有平台上,结局并不一样。这意味着您必须阅读行以识别它们,特别是仅可使用tell()搜索()到您找到的位置的文本文件。
如果我们只是读倒数第二行,很简单:
alllines=fileobject.readlines()
penultimateline=alllines[-2]
这种方法加载整个文件到内存中。如果我们要替换文件的末尾,从倒数第二行,事情变得多毛:
pen,last = 0,0
while True:
last,pen = fileobject.tell(), last
line = fileobject.readline()
if not line:
break
# back up to the penultimate line
fileobject.seek(pen) # Note: seek is *required* to switch read/write
fileobject.truncate()
fileobject.write("Ate last two lines, this is a new line.\n")
如果你只是想读以任意顺序线,linecache可能会有所帮助。
这些都扫描整个文件。像tail这样的工具可能会进行另一种优化:在文件末尾读取数据,直到找到足够的换行符来标识所需的行。这种情况变得更加复杂,因为只能在二进制模式下工作,但行解析只能在文本模式下可预测地工作。这反过来意味着我们猜测文件被linesep分隔的可能是错误的; Python的通用换行支持只能在文本模式下运行。
backsearch=0
lines=[]
while len(lines)<=2:
backsearch+=200
fileobject.seek(-backsearch, 2)
if fileobject.tell()==0:
break # ran out of file while scanning backwards
lines=fileobject.read().split(os.linesep)
fileobject.seek(-backsearch, 2)
# Now repeat the earlier method, knowing you're only processing
# the final part of the file.
相关问题
- 1. 附加倒数第二行
- 2. valgrind在将第二行打印到文件时给出错误
- 3. 数据被打印在第二行,FORTRAN
- 4. 打印第二个命令行参数
- 5. 替换文件的倒数第二行上的“模式”
- 6. Bash-如何读取文件中的倒数第二行?
- 7. 使用sed删除文件的倒数第二行
- 8. 不能得到数据文件输出到从文件打印的下一行,打印第一行多次
- 9. VBA查找倒数第二行的值
- 10. 使用c#追加到文本文件中的倒数第二行
- 11. SQL查询:倒数第二倒数第三倒数(微软SQL)
- 12. C#的倒数第二个
- 13. 打印第一元素或第二元素从文本文件
- 14. 需要在输出文件中打印文件的第二列
- 15. Python的 - 打印第二个参数
- 16. 在CSV文件中打印第一个,倒数第二个和最后一个字段
- 17. Codeigniter - 获取倒数第二行
- 18. 如何更新倒数第二行?
- 19. 附加到倒数第二个元素
- 20. 追加到倒数第二个
- 21. 也选择倒数第二到mysql值
- 22. 如何将第二行打印为第二列unix
- 23. sas倒数第二个&syserrortext
- 24. 膨化倒数第二
- 25. 只有第一行输出打印到我的文本文件
- 26. Python3打印第一个文件行
- 27. 表打印在第二页
- 28. 打印二进制文件
- 29. 比较两列并打印第二个文件中的第二列
- 30. 如何从多个文本文件打印第二行和最后三行?
假设你循环读一行一行来处理它们,就已经分配给'line'(在你阅读每一行的变量)后还后分配'line'另一个变种(说'prevline')。不涉及复制,只是一个链接到数据的名称(引用)。然后在循环结束时使用'prevline'。 – Pynchia