我通常会避免阅读这样的文件:
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/