当前位置: 首页 > 面试题库 >

如何从头开始从python文件中读取行

饶元章
2023-03-14
问题内容

我需要知道如何从python文件中读取行,以便首先读取最后一行并以这种方式继续进行操作,直到光标到达文件的开头为止。有任何想法吗?


问题答案:

通过至少三种方法可以解决此问题的一般方法,即按行反向反向读取文本文件。

普遍的问题是,由于每行的长度可以不同,因此您无法事先知道文件中每行的起始位置,也不知道其中有多少行。这意味着您需要对问题应用一些逻辑。

通用方法#1:将整个文件读入内存

使用这种方法,您只需将整个文件读入内存中,就可以采用某种数据结构,该数据结构随后允许您反向处理行列表。堆栈,双向链表甚至数组都可以做到这一点。

优点: 真正易于实现(据我所知可能内置于Python中)
缺点: 占用大量内存,可能需要一段时间才能读取大文件

通用方法2:读取整个文件,存储行的位置

使用这种方法,您还可以读取整个文件一次,但是,不是将整个文件(所有文本)存储在内存中,而是仅将二进制位置存储在文件中每行开始的位置。您可以将这些位置存储在与第一种方法中存储行的位置相似的数据结构中。

如果您想读取X行,则必须从文件中重新读取该行,并从该行开头的存储位置开始。

优点: 几乎与第一种方法一样容易实现
缺点: 可能需要一段时间才能读取大文件

通用方法3:反向读取文件,然后“将其数字化”

使用这种方法,您将从头开始逐块或类似地读取文件,并查看两端在哪里。您基本上有一个缓冲区,例如4096个字节,并处理该缓冲区的最后一行。当必须在该缓冲区中一次向后移动一行的处理到达该缓冲区的开始时,您需要从读取的第一个缓冲区之前的区域读取另一个有价值的数据,然后继续进行处理。

这种方法通常更为复杂,因为您需要处理以下情况:行在两个缓冲区上折断,而长行甚至可能覆盖两个以上的缓冲区。

但是,这是需要最少内存的应用程序,对于真正的大文件,这样做也可能值得避免首先读取千兆字节的信息。

优点: 占用很少的内存,不需要您先阅读整个文件
缺点: 很难实现,并且适合所有极端情况

网上有许多链接显示了如何执行第三种方法:

  • ActiveState Recipe 120686-向后读取文本文件
  • ActiveState食谱439045-向后读取文本文件(还有另一个实现)
  • Top4Download.com脚本-向后读取文本文件


 类似资料:
  • 因此,我有一个扫描仪,它可以使用while(file.hasNext())读取多行的文本文件,但是在它到达文本文件的末尾之后,我该如何制作它,以便在单独的while循环中重新开始读取行?

  • 问题内容: 我对此有一个文件模拟:… 我想从存在“ HDK1001”字样的行开始阅读,并在世界“ HDK7564”字样处结束阅读 我尝试使用此代码,但无法执行限制 请帮帮我 问题答案: 试试这个代码。

  • 我正在使用库python-docx解析docx文件。我需要阅读文档和段落的标题,但是我在文档中找不到任何关于文档标题的东西。有关于将标头写入新文件的文档,但没有关于读取标头的文档。有办法做到这一点吗?

  • 问题内容: 我有点头疼,只是因为一个简单,易于表达的陈述使我的脸上有些错误。 我有一个名为的文件,如下所示: 我现在想读取文件。我发现了以下这些语句,但是不起作用: 控制台上显示的错误是这样的: 已编辑 从更改为 并得到了: 问题答案: 该方法( 中没有 )可以直接读取文件: 你正在使用方法,该方法仅用于字符串参数。 编辑:新消息是一个完全不同的问题。在这种情况下,该文件中存在一些无效的。为此,我

  • 问题内容: 我有一个包含多个词典的文件,如下所示: 或这个: 换句话说,每个词典中每个键的顺序都不相同。 我的问题: 最好的阅读本词典的方式是什么,以便无论顺序如何都可以调用Date,GenName和Segment?那可能吗? 请注意…这不是来自json文件。如果字典的构造不正确,我确定可以修改生成此输出的脚本。 问题答案: 正如您在评论中提到的,您要自己创建字典,因此以痛苦的格式存储字典并不是一

  • 问题内容: 我知道如何读取字节,但是如何在Python中读取位? 我只需要从二进制文件中读取5位(而不是8位[1字节]) 有什么想法或方法吗? 问题答案: Python一次只能读取一个字节。您需要读完整的字节,然后从该字节中提取所需的值,例如 或者,如果您想要5个最低有效位,而不是5个最高有效位: 一些其他有用的位操作信息可以在这里找到:http : //wiki.python.org/moin/