yielding islice from reading file
希望有人能帮助我理解以下内容。写一个小程序来读取k行块中的csv文件。我看到了关于这个问题的其他问题,这不是我要问的。我试图理解为什么一个程序终止,而另一个程序却永远不会终止。
此代码永不终止:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from __future__ import print_function from itertools import islice import time import csv def gen_csv1(input_file, chunk_size=50): try: with open(input_file) as in_file: csv_reader = csv.reader(in_file) while True: yield islice(csv_reader, chunk_size) except StopIteration: pass gen1 = gen_csv1('./test100.csv') for chunk in gen1: print(list(chunk)) time.sleep(1) |
虽然这很管用。唯一的区别是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def gen_csv(input_file): try: with open(input_file) as in_file: csv_reader = csv.reader(in_file) while True: yield next(csv_reader) except StopIteration: pass gen = gen_csv('./test100.csv') for chunk in gen: rows = islice(gen, 50) print(list(rows)) time.sleep(1) |
号
我被难住了。任何指导都非常感谢。这更多是出于好奇心而非工作原因。
根据文件,
[islice] works like a slice() on a list but returns an iterator.
号
对空列表进行切片时,将返回空列表:
1 2 | In [118]: [][:3] Out[118]: [] |
类似地,当您
1 2 3 4 5 6 7 8 | In [98]: from itertools import islice In [114]: reader = iter([]) In [115]: list(islice(reader, 3)) Out[115]: [] In [116]: next(reader) StopIteration: |
号
由于