2

したがって、csv リーダー/ライターを使用して、Python でディレクトリ内のすべての CSV を取得して結合し、2 番目の列に他の行の値の重複を含む行を除外します。

ここに私の動かないスクリプトがあります:

import csv
import glob

with open('merged.csv','a') as out:
    seen = set()
    output = []
    out_writer = csv.writer(out)
    csv_files = [f for f in glob.glob('*.csv') if 'merged' not in f]
#csv_files = glob.glob('*.csv') 
     # I'd like to use all files including the output so that I don't
     # have to rename it when reusing the script - it should dupe-filter itself!
for filename in csv_files:
    with open(filename, 'rb') as ifile:
        read = csv.reader(ifile, delimiter=',')
        for row in read:
            if row[1] not in seen:
                seen.add(row[1])
                if row: #was getting extra rows
                    output.append(row)
out_writer.writerows(output)

シンプルなものが欠けているように感じます。私のファイルのサイズはそれぞれ約 100MB で、最終的にはこれを自動化し、異なるコンピューターがマージされたファイルを重複チェックのために共有できるようにしたいと考えています。

余分なクレジットを得るために、これを変更して、row[1]との両方row[2]が共通している行を確認するにはどうすればよいですか? (もちろん、重複フィルターと自己包含が機能したら...)

4

2 に答える 2

2

csv ライターではなく pandas を使用することをお勧めします。コードを次のように書き直します。

import pandas as pd
import glob

data = pd.concat([pd.DataFrame.from_csv(file) for
                  file in glob.glob("*.csv")]).drop_duplicates(cols=COLNAME_LIST)
data.to_csv('merged.csv')

完全な開示では、大量のcsvファイルが横たわっていないため、このコードをテストしていませんが、以前に同様のことを書いて成功しました

于 2013-10-31T21:37:29.283 に答える
1

これは pandas が必要とする少数の行数を超えています。これはストック Python であるためですが、一方では比較的単純で、複数の列の値をフィルター処理し、以前の結果の再読み取りを処理します。モジュールを使用fileinputして、複数の入力ファイルをデータ行の単一の連続ストリームとして扱うことができます。

import csv
import fileinput
import glob
import os

merged_csv = 'merged.csv'
columns = (1, 2)  # columns used for filtering
pathname = '*.csv'
tmpext = os.extsep + "tmp"
csv_files = glob.glob(pathname)

if merged_csv not in csv_files:
    prev_merged = None
else:
    prev_merged = merged_csv + tmpext
    os.rename(merged_csv, prev_merged)
    csv_files[csv_files.index(merged_csv)] = prev_merged

with open(merged_csv, 'wb') as ofile:
    csv_writer = csv.writer(ofile)
    written = set()  # unique combinations of column values written
    csv_stream = fileinput.input(csv_files, mode='rb')
    for row in csv.reader(csv_stream, delimiter=','):
        combination = tuple(row[col] for col in columns)
        if combination not in written:
            csv_writer.writerow(row)
            written.add(combination)

if prev_merged:
    os.unlink(prev_merged)  # clean up

print '{!r} file {}written'.format(merged_csv, 're' if prev_merged else '')
于 2013-10-31T23:44:45.360 に答える