0

私はこれらのような2つのファイルを持っています:

file 1 :                     file 2 :
col1    col2                 col1     col2
john    kerry                john     kerry
adam    lord                 bob      abram  
joe     hitch               

姓と名に基づいてこれらの 2 つのファイルを比較して、ファイル 2 の人を含まないファイルのみを取得したいと思います。つまり、次のようになります。

desired output file :

col1     col2
adam     lord
joe      hitch

これを試しましたが、正しい出力が得られません

import csv

reader1=csv.reader(open('file1.csv', 'r'), delimiter='\t')
reader2=csv.reader(open('file2.csv', 'r'), delimiter='\t')
writer=csv.writer(open('desired_file.csv', 'w'), delimiter=',')

row1 = reader1.next()
row2 = reader2.next()

if (row1[0] == row2[0]) and (row1[1] == row2[1]):
    print 'equal'
else:
    writer.writerow(row1)
    writer.writerow(row2)
4

3 に答える 3

2

私はセットの違いを使用します:

with open('file1') as f1, open('file2') as f2:
    data1 = set(f1)
    lines_not_in_f2 = data1.difference(f2)

ファイルのフォーマットがわずかに異なる可能性がある場合は、タプルを生成するジェネレーターでファイル オブジェクトをラップする必要がある場合があります。

def people(my_file):
    for line in myfile:
        yield tuple(x.lower() for x in line.split())

with open('file1') as f1, open('file2') as f2:
    data1 = set(people(f1))
    people_not_in_f2 = data1.difference(people(f2))

これには、f2 ファイル全体をメモリに読み込む必要がないという利点があります。出力名が順序付けされていないという欠点があります (セットに格納されているため)。

于 2012-10-12T12:14:27.287 に答える
0
results=[i for i, j in zip(reader1, reader2) if i != j]

またはset(reader1) - set(reader2)、順序が重要でない場合に使用します。

myfile = open(..., 'wb')
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(results)
于 2012-10-12T12:14:28.097 に答える
0

csvファイル形式が同じであればモジュールは必要ないと思います。この解決策はどうですか:

exclude_names = frozenset(open('file2')) # make set for performance
with open('output', 'w') as f:
    for name in open('file1'):
        if name not in exclude_names:
             f.write(name)

csvリーダー/ライターを使用したソリューション:

import csv

exclude_names = frozenset(csv.reader(open('file2.csv', 'r'), delimiter='\t'))    
with open('desired_file.csv', 'w') as f:
    writer = csv.writer(f, delimiter=',')
    for row in csv.reader(open('file1', 'r'), delimiter='\t'):
         if row not in exclude_names:
              writer.writerow(row)
于 2012-10-12T12:10:16.107 に答える