Python:第二次调用的writelines()返回空

时间:2015-07-10 12:25:11

标签: python

在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”继续,并且没有任何要写的东西。所以,必须有某种迭代器我必须重置,但我找不到什么以及如何......

2 个答案:

答案 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