Python 生成器:无法生成多个文件
Python Generator : Not able to generate multiple files
我有一个包含 65,000 个文档及其内容的文件。我把这个文件分成两个数据集作为训练和测试数据集。我想按行数分解小文件中的训练数据集并训练我的模型,但代码只产生第一次分解并继续产生它。很可能,我每次都在消耗用过的发电机。我已经在下面发布了代码以供参考。任何改进或逻辑错误发现将受到广泛赞赏。谢谢。
创建训练和测试数据集的代码:
fo = open('desc_py_output.txt','rb')
def generate_train_test(doc_iter,size):
while True:
data = [line for line in itertools.islice(doc_iter, size)]
if not data:
break
yield data
for i,line in enumerate(generate_train_test(fo,50000)):
if(i==0):
training_data = line
else:
test_data = line
现在我尝试使用以下代码创建包含 5000 个文档的小文件:
def generate_in_chunks(doc_iter,size):
while True:
data = [line for line in itertools.islice(doc_iter, size)]
if not data:
break
yield data
for i,line in enumerate(generate_in_chunks(training_data,5000)):
x = [member.split('^')[2] for member in line]
y = [member.split('^')[1] for member in line]
print x[0]
这是一次又一次地打印相同的文档。
generate_train_test
函数生成列表,因此在您的 generate_in_chunks
函数中,doc_iter
是一个列表,而不是迭代器。列表不会被消耗,因此 islice
将始终从头开始。确保 doc_iter
开头是一个迭代器,然后它就会起作用。另外,您似乎可以对两者使用相同的功能。
def chunkify(doc_iter, size):
doc_iter = iter(doc_iter) # make sure doc_iter really is an iterator
while True:
data = [line for line in itertools.islice(doc_iter, size)]
if not data:
break
yield data
或者,您可以 return 一个生成器而不是一个列表,但这只有在您在生成下一个生成器之前使用该生成器时才有效(否则您将进入无限循环)。在这种情况下,您可以使用 something like this.
我有一个包含 65,000 个文档及其内容的文件。我把这个文件分成两个数据集作为训练和测试数据集。我想按行数分解小文件中的训练数据集并训练我的模型,但代码只产生第一次分解并继续产生它。很可能,我每次都在消耗用过的发电机。我已经在下面发布了代码以供参考。任何改进或逻辑错误发现将受到广泛赞赏。谢谢。 创建训练和测试数据集的代码:
fo = open('desc_py_output.txt','rb')
def generate_train_test(doc_iter,size):
while True:
data = [line for line in itertools.islice(doc_iter, size)]
if not data:
break
yield data
for i,line in enumerate(generate_train_test(fo,50000)):
if(i==0):
training_data = line
else:
test_data = line
现在我尝试使用以下代码创建包含 5000 个文档的小文件:
def generate_in_chunks(doc_iter,size):
while True:
data = [line for line in itertools.islice(doc_iter, size)]
if not data:
break
yield data
for i,line in enumerate(generate_in_chunks(training_data,5000)):
x = [member.split('^')[2] for member in line]
y = [member.split('^')[1] for member in line]
print x[0]
这是一次又一次地打印相同的文档。
generate_train_test
函数生成列表,因此在您的 generate_in_chunks
函数中,doc_iter
是一个列表,而不是迭代器。列表不会被消耗,因此 islice
将始终从头开始。确保 doc_iter
开头是一个迭代器,然后它就会起作用。另外,您似乎可以对两者使用相同的功能。
def chunkify(doc_iter, size):
doc_iter = iter(doc_iter) # make sure doc_iter really is an iterator
while True:
data = [line for line in itertools.islice(doc_iter, size)]
if not data:
break
yield data
或者,您可以 return 一个生成器而不是一个列表,但这只有在您在生成下一个生成器之前使用该生成器时才有效(否则您将进入无限循环)。在这种情况下,您可以使用 something like this.