2012-04-24 14 views
0

我得到txt文件A有300,000行以及txt文件B有600,000行以上。現在我想要做的是逐行掃描文件A,如果該行沒有出現在文件B中,那麼它將被追加到文件C.與使用python的巨大文件B相比,從巨大文件A中找到獨特行的最快方法是什麼?

那麼,問題是如果我像我說的那樣編程上面,它需要很長時間才能完成所有的工作。那麼有沒有更好的方法來做到這一點?

+0

http://docs.python.org/library/difflib.html可能是有用的,這幾乎肯定會比任何簡單的設計更具搜索效率來檢查一行是否在其他行中文件。同樣,如果你在* nix上,diff工具也可以做到這一點。 – hexparrot 2012-04-24 16:07:22

+1

如果你在* nix平臺上,我會建議使用批處理來做到這一點(你可以從python調用bash命令),比如diff --suppress-common-lines -y <(sort file1)<(排序文件2) – pcalcao 2012-04-24 16:08:34

+0

一個有用的排序量級計算:一個字符是一個字節,一行是(比如說)75個字符,因此將整個文件讀入內存將繞着'600000 * 75/1000000 = 45MB' 。這些日子是微不足道的,所以你可以把這兩個文件讀入內存,並用這種方式進行比較。當然,如果你正在處理更大的文件,那麼你不能那樣做。 – katrielalex 2012-04-24 16:16:51

回答

14

這應該是相當快:

with open("a.txt") as a: 
    with open("b.txt") as b: 
     with open("c.txt", "w") as c: 
      c.write("".join(set(a) - set(b))) 

注意,這將不理會,這是在A或B的任何命令。如果你絕對需要保持從A你可以使用這個命令:

with open("a.txt") as a: 
    with open("b.txt") as b: 
     with open("c.txt", "w") as c: 
      b_lines = set(b) 
      c.write("".join(line for line in a if not line in b_lines)) 
+0

不錯。 +1。我認爲這應該被接受爲官方的答案,除非'c'的順序需要與'a'相同... – 2012-04-24 16:11:39

+0

@nightcracker:非常感謝,這確實是閃電般的!乾杯! – Shane 2012-04-24 16:14:28

+0

@Shane:如果我的答案解決了您的問題,請考慮通過單擊答案左側的複選框將其標記爲已接受。 – orlp 2012-04-24 16:14:57

0

不知道python的任何內容,但是:如何將文件A排序爲特定的順序?然後,您可以逐行瀏覽文件B並執行二進制搜索 - 效率更高。

0

閱讀在文件B的所有行成set

blines = set(file_b) 
for line in file_a: 
    if not line in blines: 
     append_to_file_c 

600K +不雷爾y那麼多的數據...

+0

不需要列表理解,該文件是逐行生成器。所以你可以調用'set(file_b)' – jamylak 2012-04-24 16:11:44

+0

@jamylak,對,除非你想保持排序:C中的行與A中的行順序相同,除了在B中找到的缺失行也在 – 2012-04-25 07:09:00

+0

中,無論你如何構造集它不會維持秩序。 – jamylak 2012-04-25 10:43:29

1

你可以在內存中保存B嗎?如果是這樣,請閱讀文件B並使用它包含的所有行創建一個索引。然後逐行閱讀,並檢查每行是否出現在索引中。

with open("B") as f: 
    B = set(f.readlines()) 

with open("A") as f: 
    for line in f.readlines(): 
     if line not in B: 
      print(line) 
+0

不需要調用'readlines()' – jamylak 2012-04-24 16:13:25