1. ホーム
  2. python

[解決済み] AttributeError: 'NoneType' オブジェクトには 'lower' 属性がない python

2022-02-06 09:29:10

質問

私のabc.txtfileは次のようになります。

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)

私はどこで間違っているのか、私の問題を解決するのを助けてください?

解決方法は?

あなたは 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