2012-02-29 14 views
4

2つのテキストファイルA、Bを指定すると、AのBの行番号を取得する簡単な方法は何ですか?私はdifflibがあります見ますが、行番号変更された行番号を取得する

+0

あなただけではありません、ファイルBの行を探しています(また、実際のコードでは、ファイルがなどなどなど、閉じられ得ることを確認するためにコンテキストマネージャを使用したいと思いますか)?ラインの順序は重要ですか? –

+0

difflibはあなたに[統一された差分]を与えることができます(http://docs.python.org/library/difflib.html#difflib.unified_diff)。 [これらのフォーマット](http://en.wikipedia.org/wiki/Diff#Unified_format) '@@ -l、s + l、s @@'は、削除された行の数、開始行、行数追加、開始行。 –

+0

はい、順序は重要ですが、difflibはすでにインテリジェントdiff'ingを実装しています。行番号の部分ではありません –

答えて

11

difflibはあなたが必要なものを与えることができます。想定します。このような

this 
is 
a 
bunch 
of 
lines 

this 
is 
a 
different 
bunch 
of 
other 
lines 

B.TXTコードA.TXT

import difflib 

fileA = open("a.txt", "rt").readlines() 
fileB = open("b.txt", "rt").readlines() 

d = difflib.Differ() 
diffs = d.compare(fileA, fileB) 
lineNum = 0 

for line in diffs: 
    # split off the code 
    code = line[:2] 
    # if the line is in both files or just b, increment the line number. 
    if code in (" ", "+ "): 
     lineNum += 1 
    # if this line is only in b, print the line number and the text on the line 
    if code == "+ ": 
     print "%d: %s" % (lineNum, line[2:].strip()) 

は次のように出力を提供します

[email protected] ~/temp:python diffy.py 
4: different 
7: other 

また、difflibコード"? "を見て、それをどのように処理したいかを見てみましょう。

+0

ありがとう!ところで、これは1ベースだから、fileBから行を修正するには、lineNum-1 –

+0

そう、それは1ベースとして正しく動作するはずです。それは印刷される前にインクリメントされます。右? – bgporter

1

貧乏人のソリューション取得するためのインタフェースが表示されません。

with open('A.txt') as f: 
    linesA = f.readlines() 

with open('B.txt') as f: 
    linesB = f.readlines() 

print [k for k, v in enumerate(linesB) if not v in linesA] 
+0

これは二次ランタイムを持ち、行の順序を尊重しません。 Aの行が「1」、「2」、「3」、Bの行が「1」、「2」、「3」、「2」であり、コードが出力を生成しないとします。また、Aの中に* not *という行があるかどうかを尋ねる質問にも注意してください。 –

+0

Aにはない行を要求すると良いキャッチがあります。はい、ランタイムはかなり悪いので、貧しい人のソリューションです。そして、はい、このコードは行の順序を尊重しないというのも良い点です。 –

関連する問題