我有一个文本文件,描述每行的简历:
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的新手,并且无法找出代码中的等效问题。
答案 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
而不是insert
。 insert
有两个参数(位置/索引和要插入的元素),因此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
>>>
相反,请使用tuple
或set
以及关键字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__(...)