> 文档中心 > python之islice迭代器特点及最佳实践(按指定行读文件)

python之islice迭代器特点及最佳实践(按指定行读文件)

islice是什么?怎么用?
islice() 返回一个可以生成指定元素的迭代器,用法itertools.islice(iterable, start, stop[, step])
直接看代码。

目录

1、读文件

2、操作list

形式1

形式2


1、读文件

已有文件a.txt

#cat a.txt1234567

上代码:

from itertools import islicewith open('./a.txt', 'r') as f:    for line in islice(f, 0, 3):   # 从第一行起,到第三行停止(效果等同于一次读取三行)        print(line.strip('\t\r\n'))    print("---1")    for line in islice(f, 0, 3):        print(line.strip('\t\r\n'))    print("---2")    for line in islice(f, 0, 3):        print(line.strip('\t\r\n'))speed running:123---1456---27

如需要跳过第一行每次读三行则islice(f, 1, 3):就可以了。
注意它的特点,前后几次(循环)使用相同的迭代器对象时,滚动消耗自动移动指针,很适合按行并指定行数读取文件的逻辑。

2、操作list

形式1

from itertools import islicetest=['a','b','c','d','e','f','g','h','i','j','k']for x in islice(test,0,3):     # 从初始位置开始到第四个元素停止    print(x)print("---------")for x in islice(test,0,3):    print(x)print("---------")for x in islice(test,0,None,3):    # 增加步长,即每隔3个获取;第3个参数为None表示不设置停止标记,此时默认走到结尾    print(x)speed running:abc---------abc---------adgj

第二次islice(test,0,3)和第一次获取的结果一样,为什么没消耗?因为都是操作的原test列表,第二次操作的迭代器并不是基于上次(第一次)的迭代器对象。
如果要想正常消耗迭代器,则注意迭代器对象的来源,如形式2。

形式2

from itertools import islicetest=['a','b','c','d','e','f','g','h','i','j','k']s = islice(test,0,3)for x in s:         print(x)print("---------")for x in s:    print(x)print("---------")for x in s:       print(x)speed running:abc------------------

此时第二次和第三次都没什么可消耗了,因为第一次已经消耗完毕。