在python脚本中,我使用difflib.unified_diff()
函数来接收两个文件的差异。然后,在example之后,我调用writelines()函数将结果写在屏幕上:
diff = difflib.unified_diff( .... )
sys.stdout.writelines(diff)
然后,我也想在文件中写出差异,但是我收到一个空文件。这里有一个奇怪的部分:如果我交换两个writelines()调用的顺序,我得到一个正确的文件,但空屏幕输出。只需调用最后一个命令两次就可以重现同样的问题,如下所示:
diff = difflib.unified_diff( .... )
sys.stdout.writelines(diff)
sys.stdout.writelines(diff)
这将只打印一次差异。
我认为第二次函数从diff的相同(即最后)“line”继续,并且没有任何要写的东西。所以,必须有某种迭代器我必须重置,但我找不到什么以及如何......
答案 0 :(得分:1)
difflib.unified_diff()
会返回生成器。迭代时它只产生输出一次。
如果您需要将其写出两次,请首先捕获列表中的行:
diff = list(difflib.unified_diff( .... ))
sys.stdout.writelines(diff)
sys.stdout.writelines(diff)
来自difflib.unified_diff()
documentation:
比较 a 和 b (字符串列表);以统一差异格式返回增量( a generator生成增量线)。
大胆强调我的。
答案 1 :(得分:1)
在unified_diff
返回的第一次写入后,您已经使用了生成器。
difflib.unified_diff(a,b [,fromfile] [,tofile] [,fromfiledate] [,tofiledate] [,n] [,lineterm])
比较a和b(字符串列表);以统一的diff格式返回增量(生成器生成增量线)。
如果要使用两次输出,则需要将输出存储在列表中。
diff = list(difflib.unified_diff( .... ))
一旦迭代生成器一次,它就被消耗掉了,所以没有什么东西可以在第二次迭代:
In [13]: gen = (i for i in (1,2,3))
In [14]: for i in gen:
print(i)
....:
1
2
3
In [15]: for i in gen: # already been consumed
print(i)
....:
gen上的调用列表意味着您将所有行存储在列表中,以便您可以根据需要迭代和使用这些行:
In [19]: gen = (i for i in (1,2,3))
In [20]: l = list(gen)
In [21]: for i in l:
print(i)
....:
1
2
3
In [22]: for i in l:
print(i)
....:
1
2
3