2015-07-10 104 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需要代表;) –

相關問題