![](/img/trans.png)
[英]open().read() function returns empty string when called for second time, even after reopening the file: Python
[英]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)
比較a和b (字符串列表); 以統一的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.