2013-02-06 108 views
1

我有一個問題,它與Python中的文件輸入和輸出有關(這是對此問題的延續:how to extract specific lines from a data file,現已解決)。基於另一個文件的內容的文件輸出

所以我有一個很大的文件,danish.train,十一小文件(稱爲danish.test.part-01等),他們每個人包含從danish.train文件不同的選擇數據。現在,對於這11個文件中的每一個,我想創建一個與之相配的附加文件。這意味着對於每個小文件,我想創建一個文件,其中包含danish.train的內容減去已經在小文件中的部分。

我想出來的,到目前爲止是這樣的:

trainFile = open("danish.train") 

for file_number in range(1,12): 
    input = open('danish.test.part-%02d' % file_number, 'r') 

    for line in trainFile: 
     if line not in input: 
      with open('danish.train.part-%02d' % file_number, 'a+') as myfile: 
       myfile.write(line) 

的問題是,這個代碼只給出了file_number 1輸出,雖然我已經從1-11循環。如果我改變範圍,例如到in range(2,3),我得到一個輸出danish.train.part-02,但是這個輸出包含整個danish.train的一個副本而不會忽略文件danish.test.part-02的內容,如我所願。

我懷疑這些問題可能與我沒有完全瞭解with... as運營商有關,但我不確定。任何幫助將不勝感激。

回答

1

當你使用open文件時,它會通過文件的行返回一個迭代器。這很好,因爲它可以讓你一次一行地瀏覽文件,而不會一次將整個文件保存到內存中。在你的情況下,它會導致一個問題,因爲你需要多次迭代文件。

相反,你可以閱讀完整的培訓文件到內存中,並通過它多次:

with open("danish.train", 'r') as f: 
    train_lines = f.readlines() 

for file_number in range(1, 12): 
    with open("danish.test.part-%02d" % file_number, 'r') as f: 
     test_lines = set(f) 
    with open("danish.train.part-%02d" % file_number, 'w') as g: 
     g.writelines(line for line in train_lines if line not in test_lines) 

我已經簡化的邏輯一點點,也是如此。如果你不關心線的順序,你也可以考慮將訓練線讀入一組中,然後使用set操作而不是最後一行中使用的生成器表達式。

+0

非常感謝你!這真的很有幫助! – Johanna

相關問題