Python'=='错误地返回false

时间:2015-07-23 15:32:37

标签: python python-3.x

我试图逐行区分两个文件,Python总是返回false;即使我做了相同文件的差异,Python(几乎)总是返回false。高飞的例子,但它在Python 3.4.3上复制了我的问题。

file1.txt (example)
1
2
3

file1 = r"pathtofile\file1.txt"
file2 = r"pathtofile\file1.txt"
f1 = open(file1, "r")
f2 = open(file2, "r")

for line1 in f1:
    found = False
    for line2 in f2:
        if repr(line1) == repr(line2):
            found = True
            print("true")
    if found == False:
        print("false")

Python正确识别第一行是相同的,但之后的所有内容都是false。其他人可以复制这个吗?有什么想法吗?

3 个答案:

答案 0 :(得分:8)

在第一次迭代f2之后,你已经用尽了迭代器,你需要file.seek(0)回到文件的开头。

for line1 in f1:
    found = False
    for line2 in f2:
        if repr(line1) == repr(line2):
            print("true")
    f2.seek(0) # reset pointer to start of file

你只检查f1的第一行与f2的行,在第一个循环之后没有任何内容可以迭代。

根据您想要发生的事情,当您找到匹配的行或者在内部循环中重置break时,您需要found = False

如果您想要所有匹配的行,那么只需将输出存储在列表中,或者如果文件不是很大,您可以使用集来查找以查找公共行。

with open("f1") as f1, open("f2") as f2:   
    st = set(f1)
    common = st.intersection(f2)

如果您希望差异使用st.difference(f2),则两者中的行都不使用st.symmetric_difference(f2)。这一切都取决于你真正想做的事情。

您可能还想查看filecmpdifflib

答案 1 :(得分:2)

当Python读取文件时,它实际上像光标一样在文件中移动。一旦它到达终点,它就不再有任何文字要读。您最好一次性阅读所有f2 readlines功能。这将读取整个文件并将其存储为列表,其中每一行都是列表的元素。然后你可以根据需要多次迭代它。

file1 = r"pathtofile\file1.txt"
file2 = r"pathtofile\file1.txt"
f1 = open(file1, "r")
f2 = open(file2, "r").readlines()

for line1 in f1:
    found = False
    for line2 in f2:
        if repr(line1) == repr(line2):
            print("true")
    if found == False:
        print("false")

答案 2 :(得分:2)

除了其他响应之外,如果您只是想知道文件是否相同,那么在逻辑上逐行比较文件会更好,而不是将第一个文件中的第一行与第二个文件的所有行,然后将第一个文件中的第二行与第二个文件的所有行等进行比较等。

对于此示例,可以使用for-else子句:

for line1, line2 in zip(f1, f2):
    if line1 != line2:
        print ("false")
        break   # found 2 different lines in the same place so the files can't be equal
else:
     print ("true")