我正在试图找出导致此错误的原因:
第60行: 是什么导致了这个错误???仅出现在第一行:UnboundLocalError: local variable 'name' referenced before assignment
代码:
import re
import json
import jsonpickle
from nameparser import HumanName
from pprint import pprint
import csv
import json
import jsonpickle
from nameparser import HumanName
from pprint import pprint
from string import punctuation, whitespace
def parse_ieca_gc(s):
########################## HANDLE NAME ELEMENT ###############################
degrees = ['M.A.T.','Ph.D.','MA','J.D.','Ed.M.', 'M.A.', 'M.B.A.', 'Ed.S.', 'M.Div.', 'M.Ed.', 'RN', 'B.S.Ed.', 'M.D.']
degrees_list = []
# check whether the name string has an area / has a comma
if ',' in s['name']:
# separate area of practice from name and degree and bind this to var 'area'
split_area_nmdeg = s['name'].split(',')
area = split_area_nmdeg.pop()
print 'split area nmdeg'
print area
print split_area_nmdeg
# Split the name and deg by spaces. If there's a deg, it will match with one of elements and will be stored deg list. The deg is removed name_deg list and all that's left is the name.
split_name_deg = re.split('\s',split_area_nmdeg[0])
for word in split_name_deg:
for deg in degrees:
if deg == word:
degrees_list.append(split_name_deg.pop())
name = ' '.join(split_name_deg)
# if the name string does not contain a comma, just parse as normal string
else:
area = []
split_name_deg = re.split('\s',s['name'])
for word in split_name_deg:
for deg in degrees:
if deg == word:
degrees_list.append(split_name_deg.pop())
name = ' '.join(split_name_deg)
# area of practice
category = area
# name
name = HumanName(name)
first_name = name.first
middle_name = name.middle
last_name = name.last
title = name.title
full_name = dict(first_name=first_name, middle_name=middle_name, last_name=last_name, title=title)
# degrees
degrees = degrees_list
# website
website = s.get('website','')
gc_ieca = dict(
name = name,
website = website,
degrees = degrees,
),
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)
for i in range(4):
s = myjson[i]
a = parse_ieca_gc(s)
pprint(a)
示例数据(组成数据):
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
D G Bamf M.S.
Amy Tramy Lamy Ph.D.
Last login: Tue Jul 2 15:33:31 on ttys000
/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup\ At\ Startup/ieca_first_col-394486416.142.py.command ; exit;
Samuel-Finegolds-MacBook-Pro:~ samuelfinegold$ /var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup\ At\ Startup/ieca_first_col-394486416.142.py.command ; exit;
range 4
split area nmdeg
CEP
['Lannister G. Cersei M.A.T.']
({'additionaltext': '',
'bio': '',
'category': ' CEP',
'certifications': [],
'company': '',
'counselingoptions': [],
'counselingtype': [],
'datasource': {'additionaltext': '',
'linktext': '',
'linkurl': '',
'logourl': ''},
'degrees': ['M.A.T.'],
'description': '',
'email': {'emailtype': [], 'value': 'cersei@got.com'},
'facebook': '',
'languages': 'english',
'linkedin': '',
'linktext': '',
'linkurl': '',
'location': {'address': '',
'city': '',
'country': 'united states',
'geo': {'lat': '', 'lng': ''},
'loc_name': '',
'locationtype': '',
'state': '',
'zip': ''},
'logourl': '',
'name': {'first_name': u'Lannister',
'last_name': u'Cersei',
'middle_name': u'G.',
'title': u''},
'phone': {'phonetype': [], 'value': '1112223333'},
'photo': '',
'price': {'costrange': [], 'costtype': []},
'twitter': '',
'website': ''},)
({'additionaltext': '',
'bio': '',
'category': [],
'certifications': [],
'company': '',
'counselingoptions': [],
'counselingtype': [],
'datasource': {'additionaltext': '',
'linktext': '',
'linkurl': '',
'logourl': ''},
'degrees': ['Ed.M.'],
'description': '',
'email': {'emailtype': [], 'value': ''},
'facebook': '',
'languages': 'english',
'linkedin': '',
'linktext': '',
'linkurl': '',
'location': {'address': '',
'city': '',
'country': 'united states',
'geo': {'lat': '', 'lng': ''},
'loc_name': '',
'locationtype': '',
'state': '',
'zip': ''},
'logourl': '',
'name': {'first_name': u'Argle',
'last_name': u'Bargle',
'middle_name': u'D.',
'title': u''},
'phone': {'phonetype': [], 'value': ''},
'photo': '',
'price': {'costrange': [], 'costtype': []},
'twitter': '',
'website': ''},)
({'additionaltext': '',
'bio': '',
'category': [],
'certifications': [],
'company': '',
'counselingoptions': [],
'counselingtype': [],
'datasource': {'additionaltext': '',
'linktext': '',
'linkurl': '',
'logourl': ''},
'degrees': ['Ed.M.'],
'description': '',
'email': {'emailtype': [], 'value': 'dman123@gmail.com'},
'facebook': '',
'languages': 'english',
'linkedin': '',
'linktext': '',
'linkurl': '',
'location': {'address': '',
'city': '',
'country': 'united states',
'geo': {'lat': '', 'lng': ''},
'loc_name': '',
'locationtype': '',
'state': '',
'zip': ''},
'logourl': '',
'name': {'first_name': u'Sam',
'last_name': u'Man',
'middle_name': u'D.',
'title': u''},
'phone': {'phonetype': [], 'value': '0000001111'},
'photo': '',
'price': {'costrange': [], 'costtype': []},
'twitter': '',
'website': ''},)
({'additionaltext': '',
'bio': '',
'category': [],
'certifications': [],
'company': '',
'counselingoptions': [],
'counselingtype': [],
'datasource': {'additionaltext': '',
'linktext': '',
'linkurl': '',
'logourl': ''},
'degrees': ['M.S.'],
'description': '',
'email': {'emailtype': [], 'value': ''},
'facebook': '',
'languages': 'english',
'linkedin': '',
'linktext': '',
'linkurl': '',
'location': {'address': '',
'city': '',
'country': 'united states',
'geo': {'lat': '', 'lng': ''},
'loc_name': '',
'locationtype': '',
'state': '',
'zip': ''},
'logourl': '',
'name': {'first_name': u'D',
'last_name': u'Bamf',
'middle_name': u'G',
'title': u''},
'phone': {'phonetype': [], 'value': ''},
'photo': '',
'price': {'costrange': [], 'costtype': []},
'twitter': '',
'website': ''},)
logout
[Process completed]
答案 0 :(得分:4)
您在这里使用本地变量name
:
name = HumanName(name)
您在此之前设置name
,但仅限于某些条件匹配时。当这些条件不匹配时,永远不会分配name
并抛出异常。
例如,在第一个if
分支中,循环是:
for word in split_name_deg:
for deg in degrees:
if deg == word:
degrees_list.append(split_name_deg.pop())
name = ' '.join(split_name_deg)
如果deg == word
永远不匹配,则永远不会设置name
。
您的功能也不会返回任何内容,因此行a = parse_ieca_gc(s)
只会将None
分配给a
。您需要使用return
关键字为函数设置返回值。
最后但并非最不重要的是,您只将CSV文件的第一行传递给该函数,并且该第一行的 no 网站与之关联:
Diane Grant Albrecht M.S.
答案 1 :(得分:1)
我想留下评论,但我想这应该有资格作为答案。你似乎喜欢编程(或者至少要认真对待它),所以请积极地回答我的问题:不是作为另一个批评,而是建议如何避免将来出现类似的错误/问题。
这只是我在阅读您的代码后提出的几点:
代码很混乱,这使得很难找到并遵循思路的主线(程序逻辑)。由于您不仅仅是原型设计或实验,而是编写一个功能正常的程序,您应该添加一个入口点。在python中,首先使用所有条目和元素(主要是导入,常量和函数)定义他的模块,然后只在模块底部设置带有if __name__ == '__main__':
部分的入口点。
程序并不是那么大,但是因为你试图做太多(非常快速的肮脏)并且只用几行就变得很危险。你的代码增长速度非常快,并且会像这样暴露出错误。请花点时间学习如何将代码分解为函数,这些函数是每个模块的基本构建块。尝试在模块中定义许多小的自洽函数,并从程序的主要部分调用它们。如果您设法给他们正确的名称 - 您的代码将非常易读,特别是从 __main__
部分开始。
将每个功能视为一个小程序(分而治之)。保持每个函数的行数(< = 20)小,并且参数的数量紧凑(< = 5-7)。它有很多优点:
__main__
,doctests或unittests调用工作。像这样,即使在/不使用复杂的调试技术之前,您也将始终完全控制您的程序缓慢进展可以在编写程序时不断概述您的想法。即使代码最终会比你希望的更糟糕,代码的任何增量更改都应该是可追踪的(你知道/观察每一步添加多少代码)。您甚至可以在本地开始使用版本控制(仅适用于您自己),这样您可以通过保持提交原始和自包含来缓慢进行。
如果你仍然觉得你没有给予太多代码或者编写过多的代码而没有运行它,那么你最终会遇到类似于你现在的情况。另一个技巧可能就是将exit()
调用放在新编写的代码中间或之前(通过检查异常信息的行号)。在大多数情况下,尝试打印变量并检查它们的值是否与预期相似有助于找到问题。否则只需评论一个程序的一部分,以便向前退几步(切割它直到它变得那么小,不管是什么"在" - 工作)
避免使用太多嵌套循环和条件结构。尝试每个函数不超过2-3个嵌套块。这是重要的事情。使用pylint和PEP8等工具来检查代码的质量。你会惊讶地发现有多少人抱怨这些工具能够找到看起来不错的代码。例如。每行代码有80个字符限制的动机很多。这确实可以防止编写过多的挂起和嵌套代码。理想情况下,代码总是紧凑的:每个函数都不是太宽,也不是太高。
最后,尽量避免
name = HumanName(name)
如果您编写了一行代码,以后需要花费太长时间才能进行思考,请考虑更正它。如果你写了一个你以后不理解的功能,可以考虑扔掉它。如果你做的一切都是正确的 你得到一个你不明白的错误,考虑去睡觉。
PS
别忘了抽着名的
>>> import this
希望有些观点有用。
GL!