# -*- coding:utf-8 -*-
"""
实际案例:
有某个文本文件,我们想读取其中某范围的内容如100~300行之间的内容,
python中文本文件是可迭代对象,我们是否可以使用类似列表切片方式得
到一个100~300行内容的生成器?
f = open('/var/log/dmesg')
f[100:300] # OK?
解决方案:
使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器.
"""
from itertools import islice
f = open('/var/log/dpkg.log')
# cut_f = f[100:300] # 会报错,不允许
ls_lines = f.readlines()
cut_lines = ls_lines[100:300]
# 缺点就是:readlines会把整个文件导入到内存当中,文件过大时会出现内存不足
for line in f:
print(line)
# 现在调用不会出现任何输出结果,因为上述操作已经把文件指针移动到了文件最后
f.seek(0)
# for line in f:
# print(line) # 现在会有结果出来
for line in islice(f, 100, 300):
print(line)
# islice(f, 500) # 描述前500行
# islice(f, 100, None) # 100~end
ls = range(20)
t = iter(ls) # 生成ls的迭代器
for x in islice(t, 5, 10): # 记着每次使用islice时,要重新申请一个可迭代对象,它会消耗这个迭代对象的资源
print(x)
# 5
# 6
# 7
# 8
# 9
for x in t:
print(x) # 因为t已经迭代到10那个位置
# 10
# 11
# 12
# 13
# 14
# 15
# 16
# 17
# 18
# 19
3-5对迭代器做切片操作
最新推荐文章于 2022-04-29 21:41:04 发布
本文介绍了一种利用Python标准库itertools.islice高效读取大文件指定行区间的方法,避免了将整个文件加载到内存中可能导致的内存溢出问题。
1828

被折叠的 条评论
为什么被折叠?



