从阅读文件中产生islice

时间:2017-07-08 13:44:15

标签: python python-2.7 generator yield

希望有人能帮助我理解以下内容。编写一个小程序来读取K行块中的csv文件。我已经看到了关于这个问题的其他堆栈问题,这不是我在这里问的问题。我试图理解为什么一个程序终止而另一个程序永远不会。

此代码永远不会终止:

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)

虽然这很好用。唯一的区别是来自生成器的islice之外的yield

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)

我很难过。任何指导都非常感谢。这更多是出于好奇而不是出于工作原因。

1 个答案:

答案 0 :(得分:2)

the docs

  

[islice]就像列表中的slice()一样工作,但返回一个迭代器。

切片空列表时,会返回一个空列表:

In [118]: [][:3]
Out[118]: []

类似地,当您islice为空迭代器时,返回一个空迭代器。 相反,在空迭代器上调用next会引发StopIteration

In [98]: from itertools import islice
In [114]: reader = iter([])

In [115]: list(islice(reader, 3))
Out[115]: []

In [116]: next(reader)
StopIteration: 

由于islice永远不会引发StopIteration异常,因此代码的第一个版本永远不会终止。