2012-04-21 88 views
0

我試圖從兩組列表中找到重疊列表。 我首先如何使這個Python腳本更快?

while True: 
    line=f.readline() 
    if not line: 
     break 
    list_1.append(line) 

產生第一單,並通過第二個文件中使用這個列表來掃描:

while True: 
    line1=f1.readline() 
    if not line1: 
     break 
    for i in list_1: 
     if i==line1[:17]: 
      list_2.append(line1) 
+2

行順序對您很重要嗎? – San4ez 2012-04-21 13:01:10

+0

如果文件中間出現空行,會發生什麼情況?可以忽略一半的文件嗎? – San4ez 2012-04-21 13:12:25

+2

沒有「空行」的字符串會匹配文件midle中的「if line」 - readline在字符串上留下「\ n」字符,這將評估爲 True。 – jsbueno 2012-04-21 13:15:17

回答

3

只要沒有文件過大,存放在sets然後所有行比較這些集合:

lines_1 = set(f) 
lines_2 = set(f1) 
lines_in_both = lines_1 & lines_2 
4

ThiefMasters答案將以任意順序輸出公共線。如果你想在相同的順序輸出的,因爲它們出現在文件中的一個,首先閱讀其他文件轉換爲一組:

with open("file1.txt") as f: 
    file1_set = set(f) 

然後通過控制順序文件中搜索

with open("file2.txt") as f: 
    list2 = [line for line in f if line in file1_set] 

如果生成list2在內存中不適合(我想這是比較牽強),我們仍然可以把它寫回結果連續輸出文件的工作:

with open("file2.txt") as f: 
    with open("out.txt", "w") as out: 
     for line in f: 
      if line in file1_set: 
       out.write(line) 
2

如果您試圖在兩個文件中找到差異,則還可以使用Python標準庫中包含的difflib模塊。該模塊提供了用於比較序列的類和函數。它可以用於比較文件,並可以產生各種格式的差異信息,包括HTML和上下文以及統一差異。您可以在difflib documentation中找到有用的比較方法。

difflib.SequenceMatcher(None, file1.read(), file2.read())