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

时间:2017-09-22 13:05:17

标签: python python-3.x difflib

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

2 个答案:

答案 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))
相关问题