我的abc.txt文件看起来像这样
Mary Kom 28 F
Emon Chatterje 32 M
Sunil Singh 35 M
现在我通过以下追溯得到了理想的结果:请帮帮我。我不知道我哪里错了
Enter for Search Criteria
1.FirstName 2.LastName 3.Age 4.Gender 5.Exit 1
Enter FirstName :m
Mary Kom 28 F
Emon Chatterje 32 M
Traceback (most recent call last):
File "testcode.py", line 50, in <module>
if (records.searchFName(StringSearch)):
File "testcode.py", line 12, in searchFName
return matchString.lower() in self.fname.lower()
AttributeError: 'NoneType' object has no attribute 'lower'
我的代码:
#!usr/bin/python
import sys
class Person:
def __init__(self, firstname=None, lastname=None, age=None, gender=None):
self.fname = firstname
self.lname = lastname
self.age = age
self.gender = gender
def searchFName(self, matchString):
return matchString.lower() in self.fname.lower()
def searchLName(self, matchString):
return matchString.lower() in self.lname.lower()
def searchAge(self, matchString):
return str(matchString) in self.age
def searchGender(self, matchString):
return matchString.lower() in self.gender.lower()
def display(self):
print self.fname, self.lname, self.age, self.gender
f= open("abc","r")
list_of_records = [Person(*line.split()) for line in f]
f.close()
found = False
n=0
n1 = raw_input("Enter for Search Criteria\n1.FirstName 2.LastName 3.Age 4.Gender 5.Exit " )
if n1.isdigit():
n = int(n1)
else:
print "Enter Integer from given"
sys.exit(1)
if n == 0 or n>5:
print "Enter valid search "
if n == 1:
StringSearch = raw_input("Enter FirstName :")
for records in list_of_records:
if (records.searchFName(StringSearch)):
found = True
records.display()
if not found:
print "No matched record"
if n == 2:
StringSearch = raw_input("Enter LastName :")
for records in list_of_records:
if records.searchLName(StringSearch):
found = True
records.display()
if not found:
print "No matched record"
if n == 3:
StringSearch = raw_input("Enter Age :")
if (StringSearch.isdigit()):
StringSearch1 = int(StringSearch)
else:
print "Enter Integer"
sys.exit()
for records in list_of_records:
if records.searchAge(StringSearch):
found = True
records.display()
if not found:
print "No matched record"
if n == 4:
StringSearch = raw_input("Enter Gender(M/F) :")
for records in list_of_records:
if records.searchGender(StringSearch):
found = True
records.display()
if not found:
print "No matched record"
if n == 5:
sys.exit(1)
请帮助解决我的错误到哪里?
答案 0 :(得分:6)
您的Person()
课程没有firstname
。您是从文件中的空行创建的:
list_of_records = [Person(*line.split()) for line in f]
空行会产生一个空列表:
>>> '\n'.split()
[]
导致Person(*[])
被调用,因此创建了一个没有参数的Person()
实例,保留了默认的firstname=None
。
略过空行:
list_of_records = [Person(*line.split()) for line in f if line.strip()]
您可能还希望默认为空字符串,或者在将属性视为字符串之前专门测试None
值:
def searchFName(self, matchString):
return bool(self.fname) and matchString.lower() in self.fname.lower()
此处bool(self.fname)
会返回False
空值或None
值,当没有要匹配的名字时,会为您提供快速False
返回值:
>>> p = Person()
>>> p.fname is None
True
>>> p.searchFName('foo')
False