Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python生成器:无法生成多个文件_Python 2.7_Generator_Yield Return - Fatal编程技术网

Python 2.7 Python生成器:无法生成多个文件

Python 2.7 Python生成器:无法生成多个文件,python-2.7,generator,yield-return,Python 2.7,Generator,Yield Return,我有一个包含65000份文档及其内容的文件。我把这个文件分成两个数据集,一个是训练数据集,另一个是测试数据集。我想按行数将训练数据集分解成小文件,然后训练我的模型,但代码只生成第一个分解,并继续生成。很可能,我每次都在消耗用过的发电机。我已经在下面发布了代码以供参考。任何改进或逻辑错误发现都将受到广泛赞赏。谢谢 创建培训和测试数据集的代码: fo = open('desc_py_output.txt','rb') def generate_train_test(doc_iter,size):

我有一个包含65000份文档及其内容的文件。我把这个文件分成两个数据集,一个是训练数据集,另一个是测试数据集。我想按行数将训练数据集分解成小文件,然后训练我的模型,但代码只生成第一个分解,并继续生成。很可能,我每次都在消耗用过的发电机。我已经在下面发布了代码以供参考。任何改进或逻辑错误发现都将受到广泛赞赏。谢谢 创建培训和测试数据集的代码:

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]

这是一次又一次地打印相同的文档。

函数
生成训练测试
生成列表,因此在
生成块
函数中,
doc iter
是一个列表,而不是迭代器。列表不会被使用,因此
islice
将始终从头开始。在开始时确保
doc\u 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
或者,您可以返回一个生成器而不是一个列表,但只有在生成下一个生成器之前使用该生成器(否则将进入无限循环)时,这才有效。在这种情况下,你可以使用