7

比較して違いを吐き出す必要がある 2 つの csv ファイルがあります。

CSV形式:

 Name   Produce   Number
 Adam   Apple     5
 Tom    Orange    4
 Adam   Orange    11

2 つの csv ファイルを比較し、シートとシート 2 の Adams りんごに違いがあるかどうかを教えて、すべての名前に対してそれを行い、数値を生成する必要があります。両方の CSV ファイルは同じ形式になります。

どんなポインタでも大歓迎です

4

6 に答える 6

7

私はcsvdiffを使用しました

$pip install csvdiff
$csvdiff --style=compact col1 a.csv b.csv 

pypi のパッケージへのリンク

このリンクは便利だと思いました

于 2016-07-23T12:48:00.677 に答える
5

CSV ファイルがそれほど大きくない場合、それらをメモリにロードするとマシンがひざまずいてしまうので、次のようなことを試すことができます。

import csv
csv1 = list(csv.DictReader(open('file1.csv')))
csv2 = list(csv.DictReader(open('file2.csv')))
set1 = set(csv1)
set2 = set(csv2)
print set1 - set2 # in 1, not in 2
print set2 - set1 # in 2, not in 1
print set1 & set2 # in both

大きなファイルの場合、それらを SQLite3 データベースにロードし、SQL クエリを使用して同じことを行うか、関連するキーで並べ替えてからマッチマージを行うことができます。

于 2012-06-19T20:40:12.743 に答える
1

Python の csv モジュールを関数ジェネレーターと共に使用する場合は、ネストされたループを使用して、大きな .csv ファイルを比較できます。以下の例では、大雑把な比較を使用して各行を比較しています。

import csv

def csv_lazy_get(csvfile):
    with open(csvfile) as f:
        r = csv.reader(f)
        for row in r:
            yield row

def csv_cmp_lazy(csvfile1, csvfile2):
    gen_2 = csv_lazy_get(csvfile2)

    for row_1 in csv_lazy_get(csvfile1):
        row_2 = gen_2.next()

        print("row_1: ", row_1)
        print("row_2: ", row_2)

        if row_2 == row_1:
            print("row_1 is equal to row_2.")
        else:
            print("row_1 is not equal to row_2.")

    gen_2.close()
于 2012-06-20T13:00:33.710 に答える
1

2 つの異なるファイルを比較するための最適なユーティリティの 1 つは、diff.

ここで Python の実装を参照してください: Pythonで difflib を使用して 2 つの .txt ファイルを比較する

于 2012-06-19T20:21:14.647 に答える
1
import csv

def load_csv_to_dict(fname, get_key, get_data):
    with open(fname, 'rb') as inf:
        incsv = csv.reader(inf)
        incsv.next()  # skip header
        return {get_key(row):get_data(row) for row in incsv}

def main():
    key = lambda r: tuple(r[0:2])
    data = lambda r: int(r[2])
    f1 = load_csv_to_dict('file1.csv', key, data)
    f2 = load_csv_to_dict('file2.csv', key, data)

    f1keys = set(f1.iterkeys())
    f2keys = set(f2.iterkeys())

    print("Keys in file1 but not file2:")
    print(", ".join(str(a)+":"+str(b) for a,b in (f1keys-f2keys)))

    print("Keys in file2 but not file1:")
    print(", ".join(str(a)+":"+str(b) for a,b in (f2keys-f1keys)))

    print("Differing values:")
    for k in (f1keys & f2keys):
        a,b = f1[k], f2[k]
        if a != b:
            print("{}:{} {} <> {}".format(k[0],k[1], a, b))

if __name__=="__main__":
    main()
于 2012-06-19T20:37:59.660 に答える
0

を使わないスタートですdifflib。Adam とりんごがシートに 2 回表示される可能性があるため、これは実際には構築するためのポイントにすぎません。そうではないことを確認できますか?りんごを合計する必要がありますか、それともエラーですか?

import csv
fsock = open('sheet.csv','rU')
rdr = csv.reader(fsock)
sheet1 = {}
for row in rdr:
    name, produce, amount = row
    sheet1[(name, produce)] = int(amount) # always an integer?
fsock.close()
# repeat the above for the second sheet, then compare

わかりますか?

于 2012-06-19T20:26:04.283 に答える