Python Generator:无法生成多个文件

时间:2015-10-01 06:26:07

标签: python-2.7 generator yield-return

我有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]

这是一遍又一遍地打印相同的文件。

1 个答案:

答案 0 :(得分:1)

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

或者,你可以返回一个生成器而不是一个列表,但这只有在你产生下一个生成器之前使用该生成器时才会起作用(否则你会进入一个无限循环)。在这种情况下,您可以使用something like this