来自Python文件中具有相同内容的2个文件的2行标识

时间:2017-08-30 02:05:53

标签: python iteration identity lines

我同时从两个具有相同内容(单词列表)的文本文件中读取行。

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

为什么线条不相同?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你必须改变:

if((line1 is line2) is False):

由:

if line1 == line2:

当您在Python中比较string个对象时,您无法使用is运算符,因为在大多数解释器实现中,相同的字符串表示为不同的对象大部分时间

如果你要比较的对象是相同的,那么

is运算符返回True,而不是对象的值是相同的,这是你需要的最后一种情况。

在某些解释器实现中,具有相同值的字符串可以在共享相同对象的情况下结束实现,但这不是您应该信任的脚本:

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

以上示例完全依赖于实现,将来可能会有所不同。您应该通过其值来比较不可变对象,而不是它的对象id(即is运算符所做的那样)。