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

take next n lines from a file until EOF reached

我有一个函数,它从 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 = []

...这个(丑陋的)for/else 解决方法。我读过 itertools.isliceitertools.takewhile 您将如何使用 for/else 编写此任务 w/o?

for dataset in itertools.islice(read_csv('some.csv'), LIMIT):
    new_list.append(dataset)

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

有什么想法吗?

islice 上的 for 循环不会引发 StopIteration,因此无需担心,islice 也会处理 EOF。因此,在循环结束时,您可以简单地 调用函数来创建 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 的精确倍数,则最后一个数据集将包含 '' 填充值。