案例:
对于某个文件,我只想读取到其中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的起始位置开始迭代,前面不满足条件的抛弃掉了