生成および適用負荷をpython
質問
あの"out-of-the-boxによってなされているpythonの発生リストの違いは二つのテキスト、そしてこの差をファイルを得る、その他すか。
いきたいと思い、改訂履歴のテキストもしっかり身につけるた保存したいテキスト全体のためのそれぞれの改正がある場合は単に編集します。ご本人の了解のもと、掲載してい difflib, が見えないのをどのように形成のリストの編集回線が使用できますの変更につテキストを取得します。
解決
あなたは、Googleからの差分マッチ・パッチを見ていましたか? Apparantlyドキュメントはalgoritmsのこのセットを使用するGoogle。あなたは古いファイルとの差分から最新ファイルを生成することができますので、それは、差分モジュール、だけでなく、パッチモジュールだけでなく、。
Pythonのバージョンが含まれています。
他のヒント
んdifflib.unified_diffしたいしたいですか? href="http://www.doughellmann.com/PyMOTW/difflib/index.html" ここrel="noreferrer">があります。
私の知る限り、ほとんどのdiffアルゴリズムは、共通部分を見つけるために、簡単な最長共通部分の一致を使用します2つのテキストと何でも残されているとの差と考えられています。これは、Pythonで、上記のWikipediaのページがあまりにもアルゴリズムを提供することを達成するために、独自の動的なプログラミングアルゴリズムアップコードにあまりにも難しいことではありません。
私は実施し、純粋なpython関数を適用diffパッチの回復のいずれかの入力文字列のいうことです。での使用を解析し 統一diff形式.
import re
_hdr_pat = re.compile("^@@ -(\d+),?(\d+)? \+(\d+),?(\d+)? @@$")
def apply_patch(s,patch,revert=False):
"""
Apply unified diff patch to string s to recover newer string.
If revert is True, treat s as the newer string, recover older string.
"""
s = s.splitlines(True)
p = patch.splitlines(True)
t = ''
i = sl = 0
(midx,sign) = (1,'+') if not revert else (3,'-')
while i < len(p) and p[i].startswith(("---","+++")): i += 1 # skip header lines
while i < len(p):
m = _hdr_pat.match(p[i])
if not m: raise Exception("Cannot process diff")
i += 1
l = int(m.group(midx))-1 + (m.group(midx+1) == '0')
t += ''.join(s[sl:l])
sl = l
while i < len(p) and p[i][0] != '@':
if i+1 < len(p) and p[i+1][0] == '\\': line = p[i][:-1]; i += 2
else: line = p[i]; i += 1
if len(line) > 0:
if line[0] == sign or line[0] == ' ': t += line[1:]
sl += (line[0] != sign)
t += ''.join(s[sl:])
return t
がある場合はヘッダーライン ("--- ...\n","+++ ...\n")
でスキップします。また、統一式の文字列 diffstr
代表のdiffと oldstr
や newstr
:
# recreate `newstr` from `oldstr`+patch
newstr = apply_patch(oldstr, diffstr)
# recreate `oldstr` from `newstr`+patch
oldstr = apply_patch(newstr, diffstr, True)
Pythonファイルを生成することができ統一のdiffの二つの文字列を使用 difflib (一部の標準ライブラリ):
import difflib
_no_eol = "\ No newline at end of file"
def make_patch(a,b):
"""
Get unified string diff between two strings. Trims top two lines.
Returns empty string if strings are identical.
"""
diffs = difflib.unified_diff(a.splitlines(True),b.splitlines(True),n=0)
try: _,_ = next(diffs),next(diffs)
except StopIteration: pass
return ''.join([d if d[-1] == '\n' else d+'\n'+_no_eol+'\n' for d in diffs])
Unix: diff -U0 a.txt b.txt
コードはGitHubによって試験を行ASCIIランダムなunicode文字: https://gist.github.com/noporpoise/16e731849eb1231e86d78f9dfeca3abc
それはPythonのソリューションである必要はありますか?
ソリューションについての私の最初の考えは、いずれかのバージョン管理システム(Subversionの、Gitは、など)や、UNIXシステムで標準装備され、またはWindowsベースのシステムのためのdiff
の一部であるpatch
/ cygwin
ユーティリティを使用することです。
おそらくあなたは、ファイルの違いのリストを生成するために unified_diff に使用することができます。あなただけのファイルに変更されたテキストは、あなたの将来の参考のためにそれを使用することができ、新しいテキストファイルに書き込むことができます。 これは、あなたの新しいファイルへの唯一の違いを書き込むことができますコードです。 私は、これはあなたが求めているものです願っています!
diff = difflib.unified_diff(old_file, new_file, lineterm='')
lines = list(diff)[2:]
# linesT = list(diff)[0:3]
print (lines[0])
added = [lineA for lineA in lines if lineA[0] == '+']
with open("output.txt", "w") as fh1:
for line in added:
fh1.write(line)
print '+',added
removed = [lineB for lineB in lines if lineB[0] == '-']
with open("output.txt", "a") as fh1:
for line in removed:
fh1.write(line)
print '-',removed
を使用し、この唯一の違いは出力を保存するために、あなたのコードで!