仅从 Python 中的大文件中读取特定行号?
Only read specific line numbers from a large file in Python?
我有一个非常大的文件,我想打开它并从中读取特定的行,我总是知道我想要的数据所在的行号,但我不想每次都读取整个文件是时候阅读该特定行了。
有没有办法只读取 Python 中的特定行?或者最有效的方法是什么(即尽可能少地读取文件以加快执行速度)?
遗憾的是,由于一个简单的原因,这是不可能的:线路不存在。您的文本编辑器向您显示的一行只是两段文本,中间有一个换行符(您可以在 python 中输入 \n
。如果所有行的长度都相同,则它是可能,但我认为这里不是这种情况。
如果您只阅读您的内容+您的内容,则阅读量最少。这意味着您不应使用 read
或 readlines
。而是使用 readline
来获取和丢弃不需要的行,然后再次使用它来获取您想要的内容。这可能是最有效的方法。
这里有一些选项:
- Go over the file at least once and keep track of the file offsets of the lines you are interested in。如果您可能多次查找这些行,这是一个很好的方法 并且 文件不会被更改。
- 考虑更改数据格式。例如 csv 而不是 json(见评论)。
- 如果别无选择,请使用传统的:
def get_lines(..., linenums: list):
with open(...) as f:
for lno, ln in enumerate(f):
if lno in linenums:
yield ln
在一个 4GB 的文件上,linenums = [n // 4, n // 2, n - 1]
花费了大约 6 秒,其中 n = lines_in_file
。
我有一个非常大的文件,我想打开它并从中读取特定的行,我总是知道我想要的数据所在的行号,但我不想每次都读取整个文件是时候阅读该特定行了。
有没有办法只读取 Python 中的特定行?或者最有效的方法是什么(即尽可能少地读取文件以加快执行速度)?
遗憾的是,由于一个简单的原因,这是不可能的:线路不存在。您的文本编辑器向您显示的一行只是两段文本,中间有一个换行符(您可以在 python 中输入 \n
。如果所有行的长度都相同,则它是可能,但我认为这里不是这种情况。
如果您只阅读您的内容+您的内容,则阅读量最少。这意味着您不应使用 read
或 readlines
。而是使用 readline
来获取和丢弃不需要的行,然后再次使用它来获取您想要的内容。这可能是最有效的方法。
这里有一些选项:
- Go over the file at least once and keep track of the file offsets of the lines you are interested in。如果您可能多次查找这些行,这是一个很好的方法 并且 文件不会被更改。
- 考虑更改数据格式。例如 csv 而不是 json(见评论)。
- 如果别无选择,请使用传统的:
def get_lines(..., linenums: list):
with open(...) as f:
for lno, ln in enumerate(f):
if lno in linenums:
yield ln
在一个 4GB 的文件上,linenums = [n // 4, n // 2, n - 1]
花费了大约 6 秒,其中 n = lines_in_file
。