美文网首页
3-5 如何对迭代器做切片操作?

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

作者: Diolog | 来源:发表于2019-02-09 20:32 被阅读0次

实际案例:

  • 有某个文本文件,我们想读取其中某范围的内容,如100 ~ 300行之间的内容,python中文本文件是可迭代对象,我们是否可以使用类似列表切片的方式得到一个100~300行文件内容的生成器?
    f = open(r'C:\Users\Administrator\Desktop\testpython\log.txt','w')
    f[100,300]
    如何实现?

首先生成测试用的log文件:

f = open(r'C:\Users\Administrator\Desktop\testpython\log.txt','w')
for x in range(10001):
  f.write("{}\n".format(x))

接着测试想法:

f = open(r'C:\Users\Administrator\Desktop\testpython\log.txt','r')

f[100,300]

输出结果:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_io.TextIOWrapper' object is not subscriptable

lines = f.readlines()
lines[100:300]

输出结果:
['100\n', '101\n', '102\n', '103\n', '104\n', '105\n', '106\n', '107\n', '108\n', '109\n', '110\n', '111\n', '112\n', '113\n', '114\n', '115\n', '116\n', '117\n', '118\n', '119\n', '120\n', '121\n', '122\n', '123\n', '124\n', '125\n', '126\n', '127\n', '128\n', '129\n', '130\n', '131\n', '132\n', '133\n', '134\n', '135\n', '136\n', '137\n', '138\n', '139\n', '140\n', '141\n', '142\n', '143\n', '144\n', '145\n', '146\n', '147\n', '148\n', '149\n', '150\n', '151\n', '152\n', '153\n', '154\n', '155\n', '156\n', '157\n', '158\n', '159\n', '160\n', '161\n', '162\n', '163\n', '164\n', '165\n', '166\n', '167\n', '168\n', '169\n', '170\n', '171\n', '172\n', '173\n', '174\n', '175\n', '176\n', '177\n', '178\n', '179\n', '180\n', '181\n', '182\n', '183\n', '184\n', '185\n', '186\n', '187\n', '188\n', '189\n', '190\n', '191\n', '192\n', '193\n', '194\n', '195\n', '196\n', '197\n', '198\n', '199\n', '200\n', '201\n', '202\n', '203\n', '204\n', '205\n', '206\n', '207\n', '208\n', '209\n', '210\n', '211\n', '212\n', '213\n', '214\n', '215\n', '216\n', '217\n', '218\n', '219\n', '220\n', '221\n', '222\n', '223\n', '224\n', '225\n', '226\n', '227\n', '228\n', '229\n', '230\n', '231\n', '232\n', '233\n', '234\n', '235\n', '236\n', '237\n', '238\n', '239\n', '240\n', '241\n', '242\n', '243\n', '244\n', '245\n', '246\n', '247\n', '248\n', '249\n', '250\n', '251\n', '252\n', '253\n', '254\n', '255\n', '256\n', '257\n', '258\n', '259\n', '260\n', '261\n', '262\n', '263\n', '264\n', '265\n', '266\n', '267\n', '268\n', '269\n', '270\n', '271\n', '272\n', '273\n', '274\n', '275\n', '276\n', '277\n', '278\n', '279\n', '280\n', '281\n', '282\n', '283\n', '284\n', '285\n', '286\n', '287\n', '288\n', '289\n', '290\n', '291\n', '292\n', '293\n', '294\n', '295\n', '296\n', '297\n', '298\n', '299\n']

通过第二种方式成功了,但这种方式存在问题:
readlines()方法会将文件中所有的值都读进内存中来,导致内存空间的极大浪费、不足甚至崩溃。

解决方案:

  • 使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器。
from itertools import islice
获得一个可切片迭代器
f.seek(0)
lice = islice(f,100,300)
for x in lice:
  print(x)

相关文章

网友评论

      本文标题:3-5 如何对迭代器做切片操作?

      本文链接:https://www.haomeiwen.com/subject/djszsqtx.html