Python中具有相同内容的两个文件中的两行的标识

2024-05-16 03:42:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

为什么线条不一样?你知道吗


Tags: intxtforlongestasopenfilef2
2条回答

你必须改变:

if((line1 is line2) is False):

签署人:

if line1 == line2:

在Python中比较string对象时,不能使用is运算符,因为在大多数解释器实现中,相同的字符串通常表示为不同的对象。你知道吗

is运算符返回True如果要比较的对象相同,而不是如果对象的值相同,这是您需要的最后一种情况。你知道吗

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

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

上面的例子完全依赖于实现,将来可能会有所不同。您应该通过不可变对象的值来比较它,而不是通过它的对象id(这就是is操作符所做的)。你知道吗

你的比较line1 is line2line1 == 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

相关问题 更多 >