python - 遍历大文件的一部分的内存高效方法

标签 python iteration large-files

我通常会避免阅读这样的文件:

with open(file) as f:
    list_of_lines = f.readlines()

并改用这种类型的代码。

f = open(file)
for line in file:
     #do something

除非我只需要遍历文件中的几行(并且我知道那些是哪几行),否则它认为获取 list_of_lines 的切片更容易。现在这又回来咬我了。我有一个巨大的文件(无法将其读入内存),但我不需要遍历所有行,只需要遍历其中的几行。我已经完成了代码,可以找到我的第一行所在的位置,并找到我需要编辑的行数。我只是不知道如何编写这个循环。

n = #grep for number of lines 
start = #pattern match the start line 
f=open('big_file')
#some loop over f from start o start + n
      #edit lines  

编辑:我的标题可能会引发争论而不是答案。

最佳答案

如果我正确理解了您的问题,那么您遇到的问题是将所有 文本行存储在列表中,然后进行切片会占用太多内存。您想要的是逐行读取文件,同时忽略除特定行之外的所有行(例如,行 [17,34) )。

尝试使用 enumerate 来跟踪您在遍历文件时所在的行号。这是一种基于生成器的方法,它使用 yield 一次只输出一行感兴趣的行:

def read_only_lines(f, start, finish):
    for ii,line in enumerate(f):
        if ii>=start and ii<finish:
            yield line
        elif ii>=finish:
            return

f = open("big text file.txt", "r")
for line in read_only_lines(f, 17, 34):
    print line

这个read_only_lines 函数基本上重新实现了itertools.islice来自标准库,因此您可以使用它来实现更紧凑的实现:

from itertools import islice
for line in islice(f, 17, 34):
    print line

如果您想在列表而不是生成器中捕获感兴趣的行,只需将它们与列表一起转换即可:

from itertools import islice
lines_of_interest = list( islice(f, 17, 34) )

do_something_awesome( lines_of_interest )
do_something_else( lines_of_interest )

关于python - 遍历大文件的一部分的内存高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24312123/

相关文章:

python - Django/mod_wsgi/Apache - mod_wsgi 没有使用它编译的 Python 版本 - "ModuleNotFoundError: No module named ' math'"

python - 无法使用 [OpenCV] cv2.VideoCapture.set() 设置帧宽度和高度

javascript - React - 条件渲染(多个数组的迭代)

wcf - 为 WCF 编写文件流客户端

json - Nodejs createReadStream 只读取大型 JSON 文件的一个数据 block

python - 删除两个单词之间的所有字符并用空格替换

python - 多个 Pandas 数据框的交集

java - 即使文件位于目录中,迭代文件也会给出文件未找到异常。你能告诉我为什么吗?谢谢

python - 使用日期时间确定时间间隔内的最高频率事件

java - Java处理大文件有哪些技巧