AttributeError:'NoneType'对象没有属性'lower'python

时间:2013-10-23 09:10:01

标签: python

我的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)

请帮助解决我的错误到哪里?

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