簡體   English   中英

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

[英]Python: writelines() called for a second time returns empty

在python腳本中,我使用difflib.unified_diff()函數接收兩個文件的差異。 然后,按照此示例 ,我調用writelines ()函數將結果寫在屏幕上:

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

然后,我也想將差異寫入文件中,但是收到一個空文件。 這是一個奇怪的部分:如果交換兩個writelines()調用的順序,則會得到正確的文件,但屏幕輸出為空。 只需調用最后一個命令兩次,也可以重現相同的問題,如下所示:

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

這只會將差異打印一次。

我想第二次該函數從diff的同一行(即最后一行)繼續,並且沒有任何內容可寫。 因此,必須要重置某種迭代器,但是我找不到什么以及如何...

difflib.unified_diff()返回一個generator 迭代時僅產生一次輸出。

如果您需要寫兩次,請首先捕獲列表中的行:

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

difflib.unified_diff()文檔中

比較ab (字符串列表); 以統一的diff格式返回增量( 生成增量行的生成器 )。

大膽強調我

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM