2015-10-01 126 views
1

我有一個65,000文檔及其內容的文件。我已將這個文件分成兩組作爲訓練和測試數據集的數據集。我想通過行數打破小文件中的訓練數據集並訓練我的模型,但代碼只生成第一個分解並繼續生成。最有可能的是,我每次都在使用發生器。我已經發布了以下代碼供參考。任何改進或邏輯錯誤查找將廣泛讚賞。謝謝。 代碼來創建訓練和測試數據集:Python生成器:無法生成多個文件

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

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