2013-07-26 31 views
1

昨天我一直在執行一個檢查兩個文件之間差異的小Python腳本(使用difflib),如果有結果則打印結果,否則退出代碼0。什麼是Pythonic方法來測試發生器的大小,然後顯示它?

確切的方法,difflib.unified_diff()正在返回發現的差異發電機。我怎樣才能測試這個發生器,看它是否需要打印?我試着用len()sum()看看這個發生器的尺寸是多少,但是不可能打印出來。

對不起,問這樣一個愚蠢的問題,但我真的沒有看到什麼是這個話題的良好做法。

到目前爲止,這是我在做什麼

import difflib 
import sys 

fromlines = open("A.csv").readlines() 
tolines = open("B.csv").readlines() 
diff = difflib.unified_diff(fromlines, tolines, n=0) 
if (len(list(diff))): 
    print("Differences found!") 
    # Recomputing the generator again: how stupid is that! 
    diff = difflib.unified_diff(fromlines, tolines, n=0) 
    sys.stdout.writelines(diff) 
else: 
    print("OK!") 

回答

1

您已經將您的發生器轉換爲列表,因此您不需要重新編譯它。

diff = list(difflib.unified_diff(fromlines, tolines, n=0)) 
if diff: 
    ... 
    sys.stdout.writelines(diff) 
else: 
    ... 

你甚至不需要到發電機轉換到一個列表,如果你不使用一個簡單的標誌想:

diff = difflib.unified_diff(fromlines, tolines, n=0) 
f = False 
for line in diff: 
    if not f: 
     print("Differences found!") 
     f = True 
    sys.stdout.write(line) 

if not f: 
    print("OK!") 
+0

完美!處理髮電機時我會記住這個列表技巧! –

0

你可以發電機轉換成一個列表。

diff = list(difflib.unified_diff(fromlines, tolines, n=0)) 
0

我想你不能和有道可能會生成所有數據,直到您提出StopIteration,然後獲取已生成的長度。

出了什麼問題:

import difflib 
import sys 

fromlines = open("A.csv").readlines() 
tolines = open("B.csv").readlines() 
diff = difflib.unified_diff(fromlines, tolines, n=0) 
difflines = list(diff) 
if len(difflines) : 
    sys.stdout.writelines(difflines) 
else: 
    print("OK!") 
相關問題