Python中的NameError - 不确定类或函数是否导致错误

时间:2016-05-27 19:59:16

标签: python python-2.7 nameerror

我有一个文本文件,描述每行的简历:

name university sex filename

所以一行会说像

John Texas M resume1.doc

该文件具有标准格式,不包含任何错误。有四个可能的名称和四个可能的大学,随机创建64个简历。我正在尝试编写一个程序来读取文本文件,创建一个包含名称,大学,性别和文件名属性的简历对象,并将这些对象添加到简历对象列表中。我在C ++方面有很多经验,但这是我的第一个Python程序,我被错误抛弃了:

File "mycode.py", line 142, in <module>
  resumes()
File "mycode.py", line 65, in resumes
  r = resume(name,uni,sex,filename)
NameError: global name "name" is not defined

我的代码如下:

class resume:
    def __init__(self, name, uni, sex, filename)
        self.name = name
        self.uni = uni
        self.sex = sex
        self.filename = filename

mylist[]

def resumes():
    f = open("resumes.txt",'r')
    for line in f:
        for word in line.split():
            if word == ("John" or "Fred" or "Jim" or "Michael"):
                name = word
            elif word == ("Texas" or "Georgia" or "Florida" or "Montana"):
                uni = word
            elif word == "M":
                sex = word
            elif re.match(r'\w\.doc',word):
                filename = word
        r = resume(name,uni,sex,filename)
        mylist.insert(r)

我不确定错误是在类或函数中。我的电脑没有显示任何语法错误,但我是新手,所以如果有,请随时告诉我如何修复它们。

我已经尝试在“for line in line.split()”循环之外定义name,uni等,但程序仍然存在“r = resume(name,uni,sex,filename)”的问题“所以我不确定问题是什么。我已经阅读了有关NameError的其他答案,但我是Python的新手,并且无法找出代码中的等效问题。

2 个答案:

答案 0 :(得分:1)

您的代码正在抛出NameError,因为在文件迭代的某个时刻,某些word变量不能满足您函数的这一行中的任何条件:{{ 1}},if word == ("John" or "Fred" or "Jim" or "Michael"):并未定义。

解决此错误的最简单方法是将默认值分配给类和函数范围之外的变量(或在函数范围内):

name

作为替代方案,您可以在函数中包含对变量的条件检查;如果变量尚未定义,请为其指定默认值:

name = "name"
uni = "uni"
sex = "sex"
filename = "filename"

class resume:
# rest of your code

最后,你想要在这一行附加一个冒号:

if "name" not in locals():
    name = "name"
r = resume(name,uni,sex,filename)

到此:

def __init__(self, name, uni, sex, filename)

从此处更改此行def __init__(self, name, uni, sex, filename):

mylist

到此:

mylist[]

并改变:

mylist = []

为:

mylist.insert(r)

答案 1 :(得分:1)

NameError是由未定义的变量引起的,如果在文本文件中找不到任何值。在尝试将文本文件中的值分配给它们之前,在函数中定义它们

def resumes():
    f = open("resumes.txt",'r')
    for line in f:
        name = ""
        uni = ""
        sex = ""
        filename = ""
        for word in line.split():
            ...

如果您愿意,也可以使用关键字参数预先定义类初始化中的变量(虽然这不是NameError的原因):

class resume:
    def __init__(self, name="", uni="", sex="", filename="")
        self.name = name
        self.uni = uni
        self.sex = sex
        self.filename = filename

通过键入mylist = []而不是mylist[]来完成在python中定义列表。此外,目前,列表将在全局命名空间中定义,通常不鼓励使用。相反,您可以让resumes返回一个列表并将此值分配给mylist

def resumes():
    resume_list = []
    f = open("resumes.txt",'r')
    for line in f:
        for word in line.split():
            if word == ("John" or "Fred" or "Jim" or "Michael"):
                name = word
            elif word == ("Texas" or "Georgia" or "Florida" or "Montana"):
                uni = word
            elif word == "M":
                sex = word
            elif re.match(r'\w\.doc',word):
                filename = word
        r = resume(name,uni,sex,filename)
        resume_list.insert(r)
    return resume_list

然后,您可以在代码中的任何位置执行以下操作:

mylist = resumes()

记得打开文件后关闭文件;在你的情况下,在处理完所有行之后调用f.close()。更好的是,让python使用上下文管理器with自动管理它,这样你就不必调用f.close()

def resumes():
    with open("resumes.txt",'r') as f:
        for line in f:
            ...

通常,在使用列表时,您使用的是append而不是insertinsert有两个参数(位置/索引和要插入的元素),因此mylist.insert(r)应该引发TypeError: insert() takes exactly 2 arguments (1 given)。相反,请mylist.append(r)在列表中的最后一个元素之后插入r

正如johnrsharpe在评论中指出的,你的单词比较可能没有达到预期的效果。见这个例子:

>>> word = "John"
>>> word == ("John" or "Fred" or "Jim" or "Michael")
True
>>> word = "Fred"
>>> word == ("John" or "Fred" or "Jim" or "Michael")
False
>>> 

相反,请使用tupleset以及关键字in来检查word是否等于四个名称中的任何一个:

>>> word = "John"
>>> word in {"John", "Fred", "Jim", "Michael"}
True
>>> word = "Fred"
>>> word in {"John", "Fred", "Jim", "Michael"}
True
>>>
>>> type({"John", "Fred", "Jim", "Michael"})
<type 'set'>
>>> 

最后,作为Daniel pointed out,请记住:

等函数定义之后的冒号def __init__(...)