0
  • 另外:有人可以告诉我为什么它没有选择“网站”吗?

我试图找出导致此错误的原因:

第 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]
4

2 回答 2

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)只会分配Nonea. 您需要使用return关键字为函数设置返回值。

最后但同样重要的是,您只将 CSV 文件中的第一行传递给函数,并且第一行没有与之关联的网站:

Diane Grant Albrecht M.S.           
于 2013-07-02T19:07:55.297 回答
1

我想发表评论,但我想这实际上应该有资格作为答案。您似乎喜欢编程(或者至少对此很认真),所以请积极地接受我的回答:不是作为另一条批评,而是作为如何避免将来出现类似错误/问题的建议。

这只是我在阅读您的代码后提出的几点:

1)添加入口点

代码很混乱,很难找到并遵循你的思路(程序逻辑)。由于您不仅仅是原型设计或试验,而是编写功能程序,您应该添加一个入口点。在 python 中,首先使用所有条目和元素(主要是导入、常量和函数)定义他的模块,然后才使用以下部分设置入口点:if __name__ == '__main__':在模块的底部。

2) 将代码分解为多个函数

该程序并没有那么大,但是因为您尝试做的太多(非常快速-n-脏)并且只使用几行代码,所以它变得很危险。您的代码有机地增长非常快,并暴露出这样的错误。请花点时间学习如何将代码分解为函数,这些函数是每个模块的基本构建块。尝试在您的模块中定义许多小的自洽函数,并从程序的主要部分调用它们。如果您设法给它们起正确的名称 - 您的代码将非常易读,尤其是从__main__part 开始。

将每个函数视为一个小程序(分而治之)。保持每个函数的行数少(<= 20)和参数数量紧凑(<= 5-7)。它有很多优点:

  • 您可以单独测试每个函数的代码,并通过调用 form __main__、 doctests 或 unittests 确保它正常工作。像这样,即使在应用复杂的调试技术之前/不应用复杂的调试技术之前,您也将始终完全控制您的程序
  • 每个函数都是一个闭包,并且声明的变量限制在一个局部范围内。这有助于避免可能导致“副作用”的全局变量的并发症。
  • 函数可以被其他模块导入。像这样,您拥有更好的代码组织和更高的可重用性。

3)永远不要写太多代码而不运行它

缓慢进展可以在编写程序时保持对您的想法的持续概述。即使代码最终会比您希望的更丑陋,对代码的任何增量更改都应该是可追踪的(您知道/观察每个步骤添加了多少代码)。您甚至可以在本地开始使用版本控制(仅供您自己使用),这将允许您通过保持提交的原子性和独立性来缓慢进步。

4)打印和模具

如果您仍然觉得自己付出了太多或编写了太多代码而没有运行它,那么您最终会遇到与您现在相似的情况。另一个技巧可能只是将exit()调用放在新编写的中断代码的中间或之前(通过检查异常信息的行号)。在大多数情况下,尝试打印出变量并检查它们的值是否与预期相似有助于发现问题。否则,只需评论您程序的一部分,以便后退几步(将其剪切到它变得那么小以至于“打开”的任何东西 - 有效)

5) 循环复杂度

避免过多的嵌套循环和条件结构。每个函数尽量不要超过 2-3 个嵌套块。这是重要的事情。使用 pylint 和 PEP8 等工具检查代码的质量。您会惊讶于这些工具能够找到多少关于看起来不错的代码的抱怨。例如,每行代码有 80 个字符的限制有很多动机。这确实可以防止编写过多的悬挂和嵌套代码。理想情况下,代码总是紧凑的:每个函数都不太宽,也不太高。

6)避免

最后,尽量避免

  • 将变量重新分配给自身,特别是如果您还要更改类型:name = HumanName(name)
  • 在嵌套块和表达式中定义“悬挂”变量,这些变量可能会发生也可能不会发生
  • 对全局变量的依赖(正是通过定义函数!)和过多的交叉依赖。除非您编写递归算法,否则您应该完全可以使用自上而下的方法。依赖于经过严格测试的、不确定的结果。
  • 尊重缩进 - 总是替换制表符!如果你不这样做,你就不会在 python 中走得很远(set ts=4 | set sw=4 | set et)

如果你写了一行代码让你事后思考太久,考虑改正它。如果您编写了一个以后不理解的函数,请考虑将其丢弃。如果你做的每件事都正确并且你得到一个你不理解的错误,考虑去睡觉。

附言

别忘了抽名牌

>>> import this

希望一些观点有用。

GL!

于 2013-07-02T21:25:36.373 回答