我正在尋找像我認爲改變控制系統一樣的事情,他們比較兩個文件,並且每次文件改變時保存一個小差異。 我一直在閱讀這個頁面:http://docs.python.org/library/difflib.html,它並沒有沉入我的腦海。Python Difflib Deltas和Compare Ndiff
我試圖在下面顯示的一個簡單的程序中重新創建這個, 但我似乎缺少的東西是Delta的包含至少與原始文件一樣多,等等。
難道僅僅是純粹的改變是不可能的? 我問的理由是希望很明顯 - 節省磁盤空間。
我可以每次都保存整個代碼塊,但是最好保存一次當前代碼,然後稍微改變一下。
我還試圖找出爲什麼許多difflib函數返回一個生成器而不是列表,那裏有什麼優勢?
difflib將爲我工作 - 或者我需要找到一個功能更多的專業包?
# Python Difflib demo
# Author: Neal Walters
# loosely based on http://ahlawat.net/wordpress/?p=371
# 01/17/2011
# build the files here - later we will just read the files probably
file1Contents="""
for j = 1 to 10:
print "ABC"
print "DEF"
print "HIJ"
print "JKL"
print "Hello World"
print "j=" + j
print "XYZ"
"""
file2Contents = """
for j = 1 to 10:
print "ABC"
print "DEF"
print "HIJ"
print "JKL"
print "Hello World"
print "XYZ"
print "The end"
"""
filename1 = "diff_file1.txt"
filename2 = "diff_file2.txt"
file1 = open(filename1,"w")
file2 = open(filename2,"w")
file1.write(file1Contents)
file2.write(file2Contents)
file1.close()
file2.close()
#end of file build
lines1 = open(filename1, "r").readlines()
lines2 = open(filename2, "r").readlines()
import difflib
print "\n FILE 1 \n"
for line in lines1:
print line
print "\n FILE 2 \n"
for line in lines2:
print line
diffSequence = difflib.ndiff(lines1, lines2)
print "\n ----- SHOW DIFF ----- \n"
for i, line in enumerate(diffSequence):
print line
diffObj = difflib.Differ()
deltaSequence = diffObj.compare(lines1, lines2)
deltaList = list(deltaSequence)
print "\n ----- SHOW DELTALIST ----- \n"
for i, line in enumerate(deltaList):
print line
#let's suppose we store just the diffSequence in the database
#then we want to take the current file (file2) and recreate the original (file1) from it
#by backward applying the diff
restoredFile1Lines = difflib.restore(diffSequence,1) # 1 indicates file1 of 2 used to create the diff
restoreFileList = list(restoredFile1Lines)
print "\n ----- SHOW REBUILD OF FILE1 ----- \n"
# this is not showing anything!
for i, line in enumerate(restoreFileList):
print line
謝謝!
UPDATE:
contextDiffSeq = difflib.context_diff(lines1, lines2)
contextDiffList = list(contextDiffSeq)
print "\n ----- SHOW CONTEXTDIFF ----- \n"
for i, line in enumerate(contextDiffList):
print line
----- SHOW CONTEXTDIFF -----
* 5,9 **
print "HIJ" print "JKL" print "Hello World"
打印 「J =」 + J
打印 「XYZ」
--- ---- 5,9
print "HIJ" print "JKL" print "Hello World" print "XYZ"
- 打印「結束「
另一個更新:
在Panvalet昔日的館員,源管理工具的主機,你可以創建這樣一個變更:
++ADD 9
print "j=" + j
這僅僅意味着增加一行(或行)在第9行之後。 然後出現像++ REPLACE或++ UPDATE這樣的單詞。 http://www4.hawaii.gov/dags/icsd/ppmo/Stds_Web_Pages/pdf/it110401.pdf
謝謝(請參閱上面的@Karl更新和註釋)。我可能會處理短代碼樣本 - 一般10-20行 - 所以我想我最好放棄差異概念。你將如何將差異存儲在數據庫blob中?序列化它,或者做一個''.join – NealWalters 2011-01-20 05:19:37