我有一个函数,它将csv文件中的特定列作为列表生成,并将它们附加到列表中,直到达到n的限制。问题是......
LIMIT = 10
def read_csv(filename):
with open(filename, 'r') as infile:
header = next(infile)
for line in infile:
# get column by header and append to mylist
yield mylist
new_list = []
for dataset in read_csv('some.csv'):
new_list.append(dataset)
if len(new_list) == LIMIT:
# call a func to create xml file with dataset
# grab the remaining data
else:
new_list.append(dataset)
# call a func to create xml file with dataset
new_list = []
...这个(丑陋的)/ else解决方法。我读过有关itertools.islice
和itertools.takewhile
的文章
你怎么用w / o使用for / else?
for dataset in itertools.islice(read_csv('some.csv'), LIMIT):
new_list.append(dataset)
我被困在这里,因为我必须找到一种方法来捕获islice
的StopIteration并重复它直到read_csv()
完成
任何想法?
答案 0 :(得分:1)
islice
以上的for循环不会引发StopIteration
,因此无需担心,islice
也会处理EOF。因此,在循环结束时,您只需调用func即可创建包含数据的的xml文件。而不是循环islice
我建议您只需在其上调用list()
即可将其数据放入列表中。
data = read_csv('some.csv')
new_list = list(islice(data, LIMIT))
# call a func to create xml file with data
# do something with remaining `data`
或者,如果您希望以大小read_csv
的大小从LIMIT
中断数据,那么您可以使用来自itertools的grouper
recipe:
from itertools import islice, izip_longest
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(fillvalue='', *args)
for dataset in grouper(read_csv('some.csv'), LIMIT):
# call a func to create xml file with dataset
请注意,如果read_csv
返回的商品数量不是LIMIT
的完全倍数,则最后一个数据集将包含''
填充值。