我正在使用ndiff检查两个文本文件之间的差异,并计算找到了多少差异。在某些时候,我发现我收到了两个不同的值,具体取决于编写代码行的位置......
有人能说清楚我在这里做错了吗?
我确信这一定是一件非常愚蠢的事情。谢谢!
这是代码和输出......
import difflib
text1 = open('file1.txt', encoding="utf8").readlines()
text2 = open('file2.txt', encoding="utf8").readlines()
print("Showing Data")
print("text1 => " + str(text1))
print("text2 => " + str(text2))
print("DONE!")
print("***********************************************************************")
print("Messing with ndiff")
diff_count = difflib.ndiff(text1, text2)
print("What is in diff_count? " + str(list(diff_count)))
print("Size of List =>>>" + str(len(list(diff_count))))
print("DONE!")
print("***********************************************************************")
print("Messing with ndiff II")
diff_count = difflib.ndiff(text1, text2)
print("Size of List =>>>" + str(len(list(diff_count))))
print("What is in diff_count? " + str(list(diff_count)))
print("DONE!")
print("***********************************************************************")
输出......
Showing Data
text1 => ['opentechguides website contains\n', 'tutorials and howto articles\n', 'on topics such as Linux\n', 'Windows, databases etc.,']
text2 => ['opentechguides website contains\n', 'tutorials and howto articles\n', '\n', 'on topics such as Linux\n', 'Windows, databases , networking\n', 'programming and web development.']
DONE!
***********************************************************************
Messing with ndiff
What is in diff_count? [' opentechguides website contains\n', ' tutorials and howto articles\n', '+ \n', ' on topics such as Linux\n', '- Windows, databases etc.,', '? ^^^\n', '+ Windows, databases , networking\n', '? +++ ^^^^^^^^\n', '+ programming and web development.']
Size of List =>>>0
DONE!
***********************************************************************
Messing with ndiff II
Size of List =>>>9
What is in diff_count? []
DONE!
***********************************************************************
答案 0 :(得分:1)
Python中的某些对象只能迭代一次。如果你试图第二次迭代它们,那么它们给出零元素。例如:
>>> x = iter([1,2,3,4])
>>> list(x)
[1, 2, 3, 4]
>>> list(x)
[]
我怀疑diff_count
就是这样一个对象。如果你两次调用list
,它第一次返回一个包含9个元素的列表,第二次返回一个空列表。这解释了两个代码部分中的差异。第一个代码部分显示列表的9个元素,并显示长度为零,因为在len
调用时对象已用完。第二个代码部分显示长度为9并显示列表的0个元素,因为该对象在str(list(diff_count))
调用时已用完。
如果你想多次迭代diff_count
,那么只需将它转换成一个可以多次迭代的类型,然后迭代它。
diff_count = difflib.ndiff(text1, text2)
seq = list(diff_count)
print("What is in diff_count? " + str(seq))
print("Size of List =>>>" + str(len(seq)))
答案 1 :(得分:0)
ndiff
returns a generator,而不是列表:
返回Differ风格的delta(生成delta线的生成器)
因此,第一次迭代它,你得到一个合理的价值,第二次你什么也得不到。解决方案是在第一次获取时将其列为一个列表,然后多次使用该列表:
diff_count = list(difflib.ndiff(text1, text2))