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------------------
此时第二次和第三次都没什么可消耗了,因为第一次已经消耗完毕。