0

私は自分の快適ゾーンから出て、経験がほとんどないかまったくないPythonを使用するように勧められましたが、今は行き詰まっています。2つのCSVファイル(fileA.csvとfileB.csv)を比較し、不足しているユーザー行をfileB.csvからfileA.csvに追加しようとしています。比較できるフィールドは、ユーザーの名前と名前だけです(この場合、各ファイルのrow[0]とrow[2]です)。

私の理解では、現在開いているファイルに情報を追加することはできないため、(可能であれば)3番目のファイルを作成せずに提案を受け入れることができます。以下は正しい方向に進んでいますが、データがたくさんあるので、ループが必要になります。助けてください。

import csv
reader1 = csv.reader(open('fileA', 'rb'), delimiter=',', quotechar='|')
row1 = reader1.next()
reader2 = csv.reader(open('fileB', 'rb'), delimiter=',', quotechar='|')
row2 = reader2.next()


##For Loop...

        if (row1[0] == row2[0]) and (row1[2] == row2[2]):
                ## Compare next 
        else:
                ## Append entire row to fileA.csv

FileA.csvの例:

John,Thomas,Doe,some,other,stuff
Jane, ,Smith,some,other,stuff

FileB.csvの例:

John, ,Doe,other,personal,data
Jane,Elizabeth,Smith,other,personal,data
Robin,T,Williams,other,personal,data

FileBからFileAに追加する必要がある唯一の行は、FileAが次のようになるようにRobinの完全な行です。

DesiredResult_FileA:

John,Thomas,Doe,some,other,stuff
Jane, ,Smith,some,other,stuff
Robin,T,Williams,other,personal,data
4

2 に答える 2

1

ファイルAで見つかった情報を最初にメモリにセットで保存します。

次に、ファイルAを追加モードで再度開き、ファイルBをループします。セットに見つからないBの名前は、ファイルAに追加できます。

csv_dialect = dict(delimiter=',', quotechar='|')
names = set()
with open('fileA', 'rb') as file_a:
    reader1 = csv.reader(file_a, **csv_dialect)
    next(reader1)
    for row in reader1:
        names.add((row[0], row[2]))

# `names` is now a set of all names (taken from columns 0 and 2) found in file A.

with open('fileA', 'ab') as file_a, open('fileB', 'rb') as file_b:
    writer = csv.writer(file_a, **csv_dialect)
    reader2 = csv.reader(file_b, **csv_dialect)
    next(reader2)
    for row in reader2:
        if (row[0], row[2]) not in names:
            # This row was not present in file A, add it.
            writer.writerow(row)

結合されたwith行には、Python2.7以降が必要です。以前のPythonバージョンでは、次の2つのステートメントをネストするだけです。

with open('fileA', 'ab') as file_a:
    with open('fileB', 'rb') as file_b:
        # etc.
于 2013-03-27T10:30:25.437 に答える
0

パンダを試すことができます。これは、csvファイルをより簡単に処理するのに役立つ可能性があり、より読みやすいようです。

import pandas as pd

df1 = pd.read_csv('FileA.csv', header=None)
df2 = pd.read_csv('FileB.csv', header=None)


for i in df2.index:
    # Don't append if that row is existed in FileA
    if i in df1.index:
        if df1.ix[i][0] == df2.ix[i][0] and df1.ix[i][2] == df2.ix[i][2]: continue

    df1 = df1.append(df2.ix[i])

df1.to_csv('FileA.csv', index=None, header=None)
于 2013-03-27T11:09:12.047 に答える