python - 脚本仅打印最终条目而不是删除重复项

标签 python

我正在编写一个应该删除重复条目的脚本。数据中有些人的名字输入了两次,因为他们有两个电话号码,并且由于电话号码字段不是数组,因此要输入多个,他们输入了多个条目。

我的脚本将条目更改为具有与列名称对应的键的字典,然后遍历每一行。有一个主 for 循环遍历每一行,然后有一个嵌套 for 循环遍历每个元素的所有元素,比较它们以检测重复项。当我点击重复项时,我的代码应该比较电话、电子邮件和网站,然后将它们附加到某个区域(如果它们是唯一的/不匹配)。

脚本运行,但它返回的 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.            

最佳答案

您的具体问题是,您正在将 row 写入输出 csv,但在构建字典列表的 for 循环中使用它后,您从未重新分配它:

 write_file.writerow(row)

这段代码有点困惑。我认为更简单的方法是按名称使用 OrderedDict,假设您使用的是 2.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)

它使用 Python set 类为每个唯一名称保留每个电话号码、电子邮件地址和网站的一份副本,然后将它们转换为列表,以便漂亮地写入 CSV。它不维护顺序 - 不幸的是,没有内置的 OrderedSet,但如果您想保留它们出现的顺序,您可以使用另一个 OrderedDict 而不是集合。

关于python - 脚本仅打印最终条目而不是删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17457761/

相关文章:

python - 连接两个 DataFrame 并替换 Python 中的列值

Python,列表索引超出范围错误

python - 如何使用 Selenium 和 Python 单击选项卡元素

python - 如何从命令行运行 django python 文件

Python 脚本 - 电子邮件解析器

python - 如何停止 python 脚本执行并最终进入 python shell

python - 向 Python 日志记录中的每条日志消息添加信息

python - 已删除 InDjango19 警告 : Model doesn't declare an explicit app_label

Python-将字符串化列表转换回列表

python - Python 中的 "lambda"到底是什么?