Python-对迭代器进行切片操作-itertools模块

案例:

       对于某个文件,我只想读取到其中100~200行之间的内容,是否可以通过切片的方式进行读取?

       我想:

f = open()

f[100:200]

       可行?

如何解决这个问题?

       方法1

    全部读取到内存中来

f = open()
f_all = f.readlines()

for i in f_all[100:200]:
       print(i)

# 出现问题,假如文件有20多G,那内存不够

  方法2

    把这个文件变成可迭代对象,通过 itertools 中 islice 方法

f = open()

f_need = islice(f, 100, 200)

for i in f_need:
    print(i)

解决该问题的思路

#!/usr/bin/python3

from itertools import islice

# 生成 1~20 的可迭代对象
l = range(20)

# ~5,不包括5
for i in islice(l, 5):
    print(i)
    
print("_"*30)
# 5~10,不包括10
for i in islice(l, 5, 10):
    print(i)
    
print("_"*30)
# 5~最后
for i in islice(l, 5, None):
    print(i)

print("_"*30)
# t对象,迭代会消耗t对象的生成器

t = iter(l)

for i in islice(t, 5, 10):
    print(i)
    
print("_"*30)
# 再次对t迭代,会从10开始
for x in t:
    print(x)

# 解释
# islice(可迭代对象, start, end),顾头不顾尾,
# 只取前5行数据 islice(f, 5)
# 只取5行以后的数据islice(f, 5,None)
# 不支持负数引索,每次迭代,消耗掉内部f生成器
# 本质上是从f的起始位置开始迭代,前面不满足条件的抛弃掉了

 

posted @ 2017-07-28 11:17  梦_鱼  阅读(626)  评论(0编辑  收藏  举报