Python 根据行的位置返回不同的值

Python 根据行的位置返回不同的值,python,python-3.x,difflib,Python,Python 3.x,Difflib,我正在使用ndiff检查两个文本文件之间的差异,并计算发现的差异数量。在某个时候,我发现我收到了两个不同的值,这取决于代码行的编写位置 谁能告诉我我做错了什么 我相信这一定是一件非常愚蠢的事情。谢谢 这是代码和输出 import difflib text1 = open('file1.txt', encoding="utf8").readlines() text2 = open('file2.txt', encoding="utf8").readlines() print("Showing D

我正在使用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!
***********************************************************************
而输出

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!
***********************************************************************

Python中的某些对象只能迭代一次。如果您尝试第二次迭代它们,那么它们将给出零个元素。例如:

>>> x = iter([1,2,3,4])
>>> list(x)
[1, 2, 3, 4]
>>> list(x)
[]
我怀疑
diff\u count
就是这样一个对象。如果对它调用两次
list
,第一次它返回一个包含9个元素的列表,第二次它返回一个空列表。这就解释了两个代码部分之间的差异。第一个代码部分显示列表的9个元素,并显示长度为零,因为对象在
len
调用时已耗尽。第二个代码部分显示九个长度,并显示列表的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)))
,而不是列表:

返回不同样式的增量(生成增量线的生成器)

因此,第一次遍历它时,会得到一个合理的值,第二次什么也得不到。解决方案是在首次获取时将其列为一个列表,然后多次使用该列表:

diff_count = list(difflib.ndiff(text1, text2))

精彩的。非常感谢您的澄清!