我试图逐行区分两个文件,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。其他人可以复制这个吗?有什么想法吗?
答案 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)
。这一切都取决于你真正想做的事情。
答案 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")