Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理“问题”;“非类型”;错误?_Python - Fatal编程技术网

Python 如何处理“问题”;“非类型”;错误?

Python 如何处理“问题”;“非类型”;错误?,python,Python,我正在写一个脚本,应该删除重复的条目。数据中的一些人在姓名中输入了两次,因为他们有两个电话号码,并且因为电话号码字段不是数组,要输入多个,他们输入了多个条目 我的脚本将条目更改为具有与列名对应的键的字典,然后遍历每一行。有一个主for循环遍历每一行,然后有一个嵌套for循环遍历每个元素的所有元素,比较它们以检测重复项。当我点击一个重复的,我的代码应该比较电话,电子邮件和网站,然后将它们附加到一个区域,如果它们是唯一的/不匹配的 这是我的密码: import csv # This functio

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

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

这是我的密码:

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()
            row['email'] = row['email'].split()
            row['website'] = row['website'].split()
            print row

        for i in len(myjson):

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

            write_file.writerow(row)

merge_duplicates('ieca_first_col_fake_text.txt')
因此,我的代码中的一切都很顺利,然后它遇到了第一个副本,我得到了以下错误:

{'website': [], 'phone': [], 'name': 'Diane Grant Albrecht M.S.', 'email': []}
{'website': ['www.got.com'], 'phone': ['111-222-3333'], 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': ['cersei@got.com']}
{'website': [], 'phone': [], 'name': 'Argle D. Bargle Ed.M.', 'email': []}
{'website': ['www.daManWithThePlan.com'], 'phone': ['000-000-1111'], 'name': 'Sam D. Man Ed.M.', 'email': ['dman123@gmail.com']}
Traceback (most recent call last):
  File "/Users/samuelfinegold/Documents/noodle/delete_duplicates.py", line 40, in <module>
    merge_duplicates('ieca_first_col_fake_text.txt')
  File "/Users/samuelfinegold/Documents/noodle/delete_duplicates.py", line 20, in merge_duplicates
    row['email'] = row['email'].split()
AttributeError: 'NoneType' object has no attribute 'split'
logout

错误是,如果
行['phone']
,则无法拆分它

你可以这样做

row['phone'] = row['phone'].split() if row['phone'] else []
row['email'] = row['email'].split() if row['email'] else []
row['website'] = row['website'].split() if row['website'] else []
[]
可以由您想要指定的任何默认值替换(例如:

更干净的方法是

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 []

错误是,如果
行['phone']
,则无法拆分它

你可以这样做

row['phone'] = row['phone'].split() if row['phone'] else []
row['email'] = row['email'].split() if row['email'] else []
row['website'] = row['website'].split() if row['website'] else []
[]
可以由您想要指定的任何默认值替换(例如:

更干净的方法是

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 []

就我个人而言,我会使用
来做到这一点:

row['email'] = row.get('email',[]) and row['email'].split()
# you could also use hasattr(row['email'],'split')
if 'email' in row and isinstance(row['email'],str):
    row['email'] = row['email'].split()
逻辑与以下内容相同:

if row.get('email'):
    row['email'] = row['email'].split()
虽然严格来说,如果密钥丢失(或电子邮件已被编入列表),这会重新分配,因此您可能需要执行以下操作:

row['email'] = row.get('email',[]) and row['email'].split()
# you could also use hasattr(row['email'],'split')
if 'email' in row and isinstance(row['email'],str):
    row['email'] = row['email'].split()

就我个人而言,我会使用
来做到这一点:

row['email'] = row.get('email',[]) and row['email'].split()
# you could also use hasattr(row['email'],'split')
if 'email' in row and isinstance(row['email'],str):
    row['email'] = row['email'].split()
逻辑与以下内容相同:

if row.get('email'):
    row['email'] = row['email'].split()
虽然严格来说,如果密钥丢失(或电子邮件已被编入列表),这会重新分配,因此您可能需要执行以下操作:

row['email'] = row.get('email',[]) and row['email'].split()
# you could also use hasattr(row['email'],'split')
if 'email' in row and isinstance(row['email'],str):
    row['email'] = row['email'].split()

只是检查确认一下,但我不确定这是不是错误,因为输出显示有没有电话号码的条目。但错误并未发生。如果有帮助的话,我已经用数据更新了帖子。你的stacktrace清楚地显示了
行['email']=行['email'].split()
,意思是
行['email']
也是
,“
是不同的。所以,空电话号码不一定意味着它是
None
对不起,卡蒂克,你说得对!我当时很困惑,但现在在检查打印出的是哪一行['phone']之后,我看到了区别。此外,我认为.get()可以工作,如果在.get()中出现错误,我可以像这样返回“”:row.get('website','')更简单,尽管如果有很多空字段,它可能会更昂贵:
对于输入('phone','email','website'):row[key]=row.get(key),.split()
只是检查一下以确保,但我不确定这是不是错误,因为输出显示有没有电话号码的条目。但错误并未发生。如果有帮助的话,我已经用数据更新了帖子。你的stacktrace清楚地显示了
行['email']=行['email'].split()
,意思是
行['email']
也是
,“
是不同的。所以,空电话号码不一定意味着它是
None
对不起,卡蒂克,你说得对!我当时很困惑,但现在在检查打印出的是哪一行['phone']之后,我看到了区别。此外,我认为.get()可以工作,如果在.get()中出现错误,我可以像这样返回“”:row.get('website','')更简单,尽管如果有很多空字段,它可能会更昂贵:
对于输入('phone','email','website'):row[key]=row.get(key),.split()