1

重複したエントリを削除するスクリプトを書いています。データ内の一部の人は、電話番号を 2 つ持っているため、名前を 2 回入力しています。また、電話番号フィールドが配列ではないため、複数入力するために、複数のエントリを入力しました。

私のスクリプトは、列名に対応するキーを持つ辞書にエントリを変更し、各行を通過します。各行を通過するマスター for ループと、各要素のすべての要素を実行するネストされた for ループがあり、それらを比較して重複を検出します。重複にヒットすると、コードは電話、電子メール、および Web サイトを比較し、それらが一意である/一致しない場合はそれらを領域に追加することになっています。

スクリプトは実行されますが、返される csv には、csv の最後の人物が 8 回繰り返され、他には何も含まれていません。

これが私のコードです:

import csv

# This function takes a tab-delim csv and merges the ones with the same name but different phone / email / websites.
def merge_duplicates(sheet):

    myjson = [] # myjson = list of dictionaries where each dictionary

    with(open("ieca_first_col_fake_text.txt", "rU")) as f:

        sheet = csv.DictReader(f,delimiter="\t")
        for row in sheet:
            myjson.append(row)

        write_file = csv.DictWriter(open('duplicates_deleted.csv','w'), ['name','phone','email','website'], restval='', delimiter = '\t')

        for row in myjson:

            # convert phone, email, and web to lists so that extra can be appended
            row['phone'] = row['phone'].split() if row.get('phone') else []
            row['email'] = row['email'].split() if row.get('email') else []
            row['website'] = row['website'].split() if row.get('website') else []
            print row

        i = 0

        for i in range(len(myjson)):

            # if the names match, check to see if phone, em, web match. If any match, append to first row.
            try:
                print 'trying'
                if myjson[i]['name'] == myjson[i+1]['name']:
                    if myjson[i]['phone'] != myjson[i+1]['phone']:
                        print 'detected'
                        myjson[i]['phone'].append(myjson[i+1]['phone'])
                    if myjson[i]['email'] != myjson[i+1]['email']:
                        myjson[i]['email'].append(myjson[i+1]['email'])
                    if myjson[i]['website'] != myjson[i+1]['website']:
                        myjson[i]['website'].append(myjson[i+1]['website'])
            except IndexError:
                print("We're at the end now") 

            write_file.writerow(row)
            print row

merge_duplicates('ieca_first_col_fake_text.txt')

これはcsv出力です(実在の人物ではありません...作り物です!)

"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"
"Amy Tramy Lamy Ph.D.   []  []  []"

助けてくれてどうもありがとう!


それが役立つ場合のExデータ:

name    phone   email   website
Diane Grant Albrecht M.S.           
"Lannister G. Cersei M.A.T., CEP"   111-222-3333    cersei@got.com  www.got.com
Argle D. Bargle Ed.M.           
Sam D. Man Ed.M.    000-000-1111    dman123@gmail.com   www.daManWithThePlan.com
Sam D. Man Ed.M.    
Sam D. Man Ed.M.    111-222-333     dman123@gmail.com   www.daManWithThePlan.com
D G Bamf M.S.           
Amy Tramy Lamy Ph.D.            
4

1 に答える 1

2

具体的な問題はrow、出力 csv に書き込んでいることですが、辞書のリストを作成する for ループで使用した後に再割り当てしないことです。

 write_file.writerow(row)

このコードは少し混乱しています。OrderedDict2.7以降を使用していると仮定すると、より簡単なアプローチは名前で使用することだと思います:

http://docs.python.org/2/library/collections.html#collections.OrderedDict

from collections import OrderedDict

people = OrderedDict()
with(open("ieca_first_col_fake_text.txt", "rU")) as f:
    sheet = csv.DictReader(f,delimiter="\t")
    for row in sheet:
        name = row.get('name')
        if name:
            contact_information = people.setdefault(name, {})
            contact_information.setdefault('phone', set()).add(row.get('phone'))
            contact_information.setdefault('email', set()).add(row.get('email'))
            contact_information.setdefault('website', set()).add(row.get('website'))

    write_file = csv.DictWriter(open('duplicates_deleted.csv','w'), ['name','phone','email','website'], restval='', delimiter = '\t')
    for name, contact_information in people:
        row_dict = {'name': name}.update({list(contact_field) for contact_field in contact_information.values()})
        write_file.writerow(row_dict)

Pythonsetクラスを使用して、一意の名前ごとに電話番号、電子メール アドレス、および Web サイトのコピーを 1 つ保持し、CSV にきれいに書き込むためのリストに変換します。それは順序を維持しません - 残念ながら組み込みの はありませんが、それらが見られた順序を維持したい場合は、 set の代わりにOrderedSet別のものを使用できます。OrderedDict

于 2013-07-03T20:49:16.290 に答える