希望有人能帮助我理解以下内容。编写一个小程序来读取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)
我很难过。任何指导都非常感谢。这更多是出于好奇而不是出于工作原因。
答案 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
异常,因此代码的第一个版本永远不会终止。