从文件中取下n行,直到达到EOF

时间:2015-01-22 11:16:26

标签: python file python-2.7 itertools

我有一个函数,它将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.isliceitertools.takewhile的文章 你怎么用w / o使用for / else?

来编写这个任务
for dataset in itertools.islice(read_csv('some.csv'), LIMIT):
    new_list.append(dataset)

我被困在这里,因为我必须找到一种方法来捕获islice的StopIteration并重复它直到read_csv()完成

任何想法?

1 个答案:

答案 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的完全倍数,则最后一个数据集将包含''填充值。