0

【Python3を使用】2つのcsvファイルの内容を比較し、内容が同じであればスクリプトを出力させたい。つまり、すべての行が一致しているかどうか、一致していない場合は、一致していない行数を知らせてくれるはずです。

また、後でコードを変更して、一致しないすべての行を別のファイルに書き込む柔軟性が欲しいです。

さらに、2 つのファイルには技術的にはまったく同じ内容が含まれている必要がありますが、行の順序が同じではない場合があります (ヘッダーを含む最初の行を除く)。

入力ファイルは次のようになります。

field1  field2  field3  field4  ...
string  float   float   string  ...
string  float   float   string  ...
string  float   float   string  ...
string  float   float   string  ...
string  float   float   string  ...
...     ...     ...     ...     ...

私が現在実行しているコードは次のとおりですが、正直なところ、これが最良の (最も pythonic な) 方法であるかどうかはわかりません。また、try: while 1: ...コードが何をしているのかわかりません。このコードは、フォーラムと python ドキュメントを精査した結果です。これまでのところ、コードは非常に長時間実行されます。

私は非常に新しいので、コードに関するフィードバックをお待ちしております。また、可能な推奨事項について説明をお願いします。

コード:

import csv
import difflib

'''
Checks the content of two csv files and returns a message.
If there is a mismatch, it will output the number of mismatches.
'''

def compare(f1, f2):

    file1 = open(f1).readlines()
    file2 = open(f2).readlines()

    diff = difflib.ndiff(file1, file2)

    count = 0

    try:
        while 1:
            count += 1
            next(diff)
    except:
        pass

    return 'Checked {} rows and found {} mismatches'.format(len(file1), count)

print (compare('outfile.csv', 'test2.csv'))

編集: ファイルには重複が含まれている可能性があるため、セットに保存することはできません(すべての重複が削除されるためですよね?)。

4

2 に答える 2

2

try-while ブロックは単純に を繰り返しdiffます。代わりに for ループを使用する必要があります。

count = 0
for delta in diff:
    count += 1

またはさらにPython的なジェネレーター式

count = sum(1 for delta in diff)

(元のコードcountは各反復の前にインクリメントするため、カウントが1つ大きくなります。あなたの場合、それが正しいかどうか疑問に思います。)

于 2013-06-18T12:48:06.527 に答える
0

while 1 に関する質問に答えるには:

ジェネレーターとイテレーターの詳細をお読みください。

Diff.ndiff() は、イテレータを返すジェネレータです。ループは、next() を呼び出して反復しています。差分が見つかる限り (イテレータが次に移動します)、カウントを増やします (これにより、異なる行の総数が得られます)。

于 2013-06-18T13:11:29.113 に答える