2

このコードを使用して、2 つの csv リストの違いを見つけ、フォーマットに関する質問をいくつかしています。これはおそらく簡単な修正ですが、私は新しく、学習しようとしていて、多くの問題を抱えています。

 import difflib

 diff=difflib.ndiff(open('test1.csv',"rb").readlines(), open('test2.csv',"rb").readlines()) 

 try:
  while 1:
    print diff.next(),
except:
 pass

コードは正常に動作し、探している出力が次のように得られます。

 Group,Symbol,Total

 - Adam,apple,3850

 ?           ^
 + Adam,apple,2850

 ?           ^
 bob,orange,-45

 bob,lemon,66

 bob,appl,-56

 bob,,88

私の質問は、書式設定をきれいにする方法です。グループ、シンボル、合計を別々の列にして、下のテキストを並べることはできますか?

また、変更できますか?私が決定したテキストを表現するには?テスト 1 やテスト 2 など、どのシートから来たのかを表しますか?

助けてくれてありがとう

4

3 に答える 3

5

を使用difflib.unified_diffすると、よりクリーンな出力が得られます。以下を参照してください。

また、 と の両方がジェネレーターオブジェクトであるDifferオブジェクトをdifflib.ndiff返しdifflib.unified_diffます。これは for ループで直接使用でき、いつ終了するかを認識しているため、自分で例外を処理する必要はありません。注意; 後のコンマは、別の改行を追加しないようにするためのものです。lineprint

import difflib
s1 = ['Adam,apple,3850\n', 'bob,orange,-45\n', 'bob,lemon,66\n', 
      'bob,appl,-56\n', 'bob,,88\n']
s2 = ['Adam,apple,2850\n', 'bob,orange,-45\n', 'bob,lemon,66\n', 
      'bob,appl,-56\n', 'bob,,88\n']

for line in difflib.unified_diff(s1, s2, fromfile='test1.csv',
                 tofile='test2.csv'): 
    print line,

これは与える:

--- test1.csv
+++ test2.csv
@@ -1,4 +1,4 @@
-Adam,apple,3850
+Adam,apple,2850
 bob,orange,-45
 bob,lemon,66
 bob,appl,-56

test1.csvしたがって、との間でどの行が変更されたかが明確にわかりますtest1.csv

于 2012-09-20T20:45:14.997 に答える
1

列を整列するには、文字列の書式設定を使用する必要があります。

print "%-20s %-20s %-20s" % (row[0],row[1],row[2])

?を任意のテキスト テストに変更するには、 を使用しますs.replace('any text i like')

于 2012-09-20T22:07:04.037 に答える
0

あなたの問題はCSV形式にもっと関係しています.CSV形式は、difflib列型フィールドを見ているとは考えていません. 必要なのは、ガイドが指しているフィールドを把握して、列を印刷するときに調整できるようにすることです。

CSV ファイルが単純な場合、つまり、コンマや (身震いする) 改行が埋め込まれた引用符で囲まれたフィールドが含まれていない場合は、 を使用split(',')してそれらをフィールドに分割し、次のようにガイドが指している場所を把握できます。

def align(line, guideline):
    """
    Figure out which field the guide (^) points to, and the offset within it.
    E.g., if the guide points 3 chars into field 2, return (2, 3)
    """
    fields = line.split(',')
    guide = guideline.index('^')
    f = p = 0
    while p + len(fields[f]) < guide:
        p += len(fields[f]) + 1     # +1 for the comma
        f += 1
    offset = guide - p
    return f, offset

ガイドを適切に表示するのは簡単です。すべてを 12 スペース幅で印刷して、列を整列させたいとします。

diff=difflib.ndiff(...)
for line in diff:
    code = line[0]  # The diff prefix
    print code,
    if code == '?':
        fld, offset = align(lastline, line[2:])
        for f in range(fld):
            print "%-12s" % '',
        print ' '*offset + '^'
    else:
        fields = line[2:].rstrip('\r\n').split(',')
        for f in fields:
            print "%-12s" % f,
        print
        lastline = line[2:]

CSV ファイルを解析する唯一の信頼できる方法は、csvモジュール (または堅牢な代替手段) を使用することであることに注意してください。しかし、それを diff 形式で (完全に一般的に)うまく機能させるのは、少し頭の痛い問題です。主に可読性に関心があり、CSV がそれほどぎこちなくない場合は、おそらく時折の混乱に耐えることができます。

于 2012-09-22T19:54:46.417 に答える