3-5对迭代器做切片操作

本文介绍了一种利用Python标准库itertools.islice高效读取大文件指定行区间的方法,避免了将整个文件加载到内存中可能导致的内存溢出问题。
# -*- 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值