2015-08-31 114 views
-1

我有兩個字符串:stringAstringB如何計算Python中的差分

我想stringAstringB之間計算差,使得它僅包含兩個之間的區別。如果我在stringA上應用差異,我應該可以得到stringB

在Python中有difflib,但它不像上面那樣計算機差異幾乎可以保存兩個字符串的內容。

例子:

stringA = "apple\nball\n" 
stringB = "apple\ncat\n" 

現在差​​應該像-2,+2cat\n,它只是一個例子,但我想區別是最低限度的信息。

現在,如果我將以上差異應用於stringA我應該得到stringB

+0

我不清楚你的意思是「最低限度的信息」。如果您不想使用上下文,請使用'difflib.unified_diff(...,n = 0)',否則請花幾個詞來解釋爲什麼這樣做不能達到您想要的效果。 –

+0

嗨感謝您的回覆,以下是我的目標:我得到一個對象A並將它發送給Alice,然後我收到一個對象A'[幾乎A但幾行更改]。現在,我不再發送A',而只想發送差異,以便Alice可以將這個差異應用於A並獲得A'。 當我試圖使用difflib來計算diff時,它似乎也保存了常見的線條和差異。但我只是想發送差異來節省帶寬。我希望這會有所幫助。 – user4993781

+0

'n'= 0'(也許使用gzip壓縮)'unified_diff'有幫助嗎? –

回答

0

如果你不希望的背景下,只需用壓制它通過傳遞n=0difflib.unified_diff()

>>> import difflib 
>>> a = ['line 1\n', 'line 2\n', 'line 3'] 
>>> b = ['line 1\n', 'line 5\n', 'line 3'] 
>>> delta = list(difflib.unified_diff(a, b, n=0)) 
>>> delta 
['--- \n', '+++ \n', '@@ -2 +2 @@\n', '-line 2\n', '+line 5\n'] 

您還可以通過使用gzip或其他算法壓縮它降低輸出尺寸。

不幸的是,Python沒有提供恢復統一差異的方法。您可以編寫自己的代碼(這並不困難),或者使用Web上現有的一個庫(例如python-patch)。

您也可以使用大多數Unix系統上的patch(1)工具。

+0

將python補丁將爲這種情況下工作? – user4993781

+0

是的:它支持統一差異。 –

+0

是否有任何示例如何使用python-patch,我很抱歉,我是編程新手。 – user4993781

0

您可以使用difflib庫來做到這一點。看看unified_diff函數。

+0

這不應該是一個答案,尤其是因爲OP提到'difflib'沒有這樣做。如果'difflib' _can_這樣做,你應該解釋如何。 – Cyphase

+0

嗨hspandher感謝您的答覆,正如我所提到的difflib幾乎存儲的兩個字符串的差異以及共同的線,我想只保存差異,這樣我應該能夠恢復新聞字符串,如果我將差異應用於舊的。 – user4993781

+0

你會如何爲此使用'difflib.unified_diff'?你能舉一個例子嗎?只要提到一個函數應該在對問題的評論:)中完成。 – Cyphase

0

使用標準庫中的difflib.unified_diff

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] 
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] 
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'): 
...  sys.stdout.write(line) 
--- before.py 
+++ after.py 
@@ -1,4 +1,4 @@ 
-bacon 
-eggs 
-ham 
+python 
+eggy 
+hamster 
guido 
+1

你會如何使用'difflib.unified_diff'?你能舉一個例子嗎?只要提到一個函數應該在對問題的評論:)中完成。 – Cyphase

+0

我從副本粘貼了官方文檔的示例。 – kostya

+0

,但它似乎也存儲了最後一條共同的代碼。再加上如何恢復s1​​給出unified_diff的輸出。 – user4993781