从文件中取出下 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.islice
和 itertools.takewhile
您将如何使用 for/else 编写此任务 w/o?
for dataset in itertools.islice(read_csv('some.csv'), LIMIT):
new_list.append(dataset)
我被困在这里,因为我必须找到一种方法来捕获 islice
s 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
的精确倍数,则最后一个数据集将包含 ''
填充值。
我有一个函数,它从 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.islice
和 itertools.takewhile
您将如何使用 for/else 编写此任务 w/o?
for dataset in itertools.islice(read_csv('some.csv'), LIMIT):
new_list.append(dataset)
我被困在这里,因为我必须找到一种方法来捕获 islice
s 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
的精确倍数,则最后一个数据集将包含 ''
填充值。