2014-06-21 156 views
-1

我有兩個輸入文件:Python的比較兩個文件部分

輸入1:

好句子
2跑道
三跑道
右跑道
一個途徑

4通路
零通路

輸入2:

好句子
2跑道
三跑道
右跑道
零途徑

一個途徑
4通路

我已經使用了以下代碼:

def diff(a, b): 
y = [] 
for x in a: 
    if x not in b: 
     y.append(x) 
    else: 
     b.remove(x) 
return y 

with open('output_ref.txt', 'r') as file1: 
    with open('output_ref1.txt', 'r') as file2: 
    same = diff(list(file1), list(file2)) 
    print same 
    print "\n" 

if '\n' in same: 
    same.remove('\n') 

with open('some_output_file.txt', 'w') as FO: 
    for line in same: 
    FO.write(line) 

和預期的輸出結果是:

一個途徑

零途徑

但輸出我得到一個空的輸出這一點。問題是我不知道如何將文件中的內容部分存儲到列表中,然後比較並最終從那裏讀取它。有人可以在這方面幫助我嗎?

+0

你從文件中想要什麼線? –

+0

在第一部分(前五行)中,第二個文件的前半部分缺少「一條途徑」。在第二部分中,「零通路」缺失。所以這兩行是文件的預期輸出..你能幫我得到這個... – user3747896

回答

0

看來,如果你只是想在兩個文件中都有共同的文本行,那麼設置將會提供一個好方法。事情是這樣的:

content1 = set(open("file1", "r")) 
content2 = set(open("file2", "r")) 
diff_items = content1.difference(content2) 

UPDATE:但它是這樣的一個問題是關於在同一意義的diff效用區別?即順序很重要(看起來像這個例子)。

+0

嗨,感謝您的答覆,我不想使用集,而是我需要存儲的文件的前半部分並與其他文件的前半部分進行比較,並以迭代方式進行。你能幫我嗎? – user3747896

0

使用sets

with open('output_ref.txt', 'r') as file1: 
    with open('output_ref1.txt', 'r') as file2: 
     f1 = [x.strip() for x in file1] # get all lines and strip whitespace 
     f2 = [x.strip() for x in file2] 
     five_f1 = f1[0:5] # first five lines 
     two_f1 = f1[5:] # rest of lines 
     five_f2 = f2[0:5] 
     two_f2 = f2[5:] 
     s1 = set(five_f1) # make sets to compare 
     s2 = set(two_f1) 
     s1 = s1.difference(five_f2) # in a but not b 
     s2 = s2.difference(two_f2) 
     same = s1.union(s2) 


with open('some_output_file.txt', 'w') as FO: 
    for line in same: 
     FO.write(line+"\n") # add new line to write each word on separate line 

沒有使用自己的方法設置:

with open('output_ref.txt', 'r') as file1: 
    with open('output_ref1.txt', 'r') as file2: 
     f1 = [x.strip() for x in file1] 
     f2 = [x.strip() for x in file2] 
     five_f1 = f1[0:5] 
     two_f1 = f1[5:] 
     five_f2 = f2[0:5] 
     two_f2 = f2[5:] 
     same = diff(five_f1,five_f2) + diff(two_f1,two_f2) 
     print same 
['one pathway', 'zero pathway'] 
+0

嗨,感謝您的回覆,我不想使用集,而是我需要部分地存儲文件的前半部分,並與其他文件的前半部分進行比較,並以迭代的方式進行。你能幫我嗎? – user3747896

+0

你的輸出沒有意義,你的函數做的是將項目添加到y中,但不在b中,這正是s.difference正在做的事情,用你的問題重新說明你的問題以準確顯示你如何期待你的輸出 –