2017-08-30 80 views
2

我正在同時從具有相同內容(單詞列表)的兩個文本文件中讀取行。Python中具有相同內容的2個文件中的2行的標識

peach 
carrot 
apple 
lemon 

我想檢查兩條同步線是否相同。如果不是,總體相似性會下降。由於這兩個文件是相同的,因此檢查身份應該導致100%的相似性。相反,我得到0%。

from itertools import izip, izip_longest 

with open(r'file1.txt', "rb") as f1, open(r'file2.txt', "rb") as f2: 

    #initialize numerator & denominator values for calculating file similarity 
    nTotal = 4 #total number of lines in each file 
    nIdent = nTotal 

    for line1, line2 in izip_longest(f1, f2): 

     if((line1 is line2) is False): 

      nIdent -=1 

    similarity = nIdent/nTotal 

爲什麼這些線不相同?

回答

4

您的比較line1 is line2不是line1 == line2相同。對象是不是一樣,但它們代表的數據是。

equal_lines = 0 

with open(r'file1.txt', "rb") as f, open(r'file2.txt', "rb") as f2: 
    for f1_line, f2_line in zip(f.readlines(), f2.readlines()): 
     if f1_line == f2_line: 
      equal_lines += 1 
+0

+用於簡化代碼 –

2

你必須改變:

if((line1 is line2) is False): 

由:

if line1 == line2: 

當你在Python比較string對象,則不能使用is操作,因爲在大多數解釋執行相同的字符串在大多數時間被表示爲不同的對象

is運算符返回True如果您比較的對象是相同的,而不是對象的值是否相同,那麼這是您需要的最後一種情況。

在一些解釋執行字符串具有相同值的文字可以結束實現共享相同的對象,但不是說你應該在你的腳本相信一件事:

'abc' is 'abc' # True in CPython. 

上面的例子是完全實現依賴,並且可以在將來變化。你應該通過它的值來比較不可變的對象,而不是通過它的對象ID(這是運算符所做的)。

相關問題