2015-07-10 100 views
1

在python脚本中,我使用difflib.unified_diff()函数来接收两个文件的差异。接着,将这个example,我叫writelines()函数在屏幕上书写结果:Python:writelines()第二次调用返回空

diff = difflib.unified_diff(....) 
sys.stdout.writelines(diff) 

于是,我也想写在一个文件的不同,但是我收到一个空文件。这里出现了一个奇怪的部分:如果我交换两个writelines()调用的顺序,我会得到一个正确的文件,但是屏幕输出为空。同样的问题也可以通过调用最后一个命令两次来重现,如下所示:

diff = difflib.unified_diff(....) 
sys.stdout.writelines(diff) 
sys.stdout.writelines(diff) 

这将只打印diff一次。

我想第二次函数继续从差异的相同(即最后一个)“行”,并没有任何东西要写。所以,必须有某种迭代器需要重置,但我找不到什么以及如何...

回答

1

difflib.unified_diff()返回一个生成器。迭代时它只产生一次

如果你需要将它先写了两次,捕获列表中的台词:

diff = list(difflib.unified_diff(....)) 
sys.stdout.writelines(diff) 
sys.stdout.writelines(diff) 

difflib.unified_diff() documentation

比较一个b(字符串列表);以统一差异格式返回增量(a generator,生成三角形线)。

大胆重点矿井

+0

非常感谢您的即时答复!有效! :-D – MakisH

1

您在unified_diff返回的第一次写入后消耗了发生器。

difflib.unified_diff(A,B [,FROMFILE] [,TOFILE] [,fromfiledate] [,tofiledate] [,N] [,lineterm])

比较A和B(表的字符串);以统一差异格式返回一个增量(一个生成器生成增量线)。

如果要使用两次,则需要将输出存储在列表中。

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) 
    ....:  

的根调用列表意味着你存储在所有行列表,以便您可以根据需要多次迭代和使用线路:

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 
+0

谢谢你们的快速回答!你们都提供了同样的解决方案,但我只能将其中的一个标记为解决方案。 :-) – MakisH

+0

@MakisH,不用担心,Martijn需要代表;) –

相关问题