关于python:从阅读文件中产生islice

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)

虽然这很管用。唯一的区别是isliceyield外与发电机。

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]: []

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

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:

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