-1

我的 abc txt 文件如下所示:

Nathan  Johnson 23 M
Mary    Kom     28 F
John    Keyman  32 M
Edward  Stella  35 M

现在,当我在文件中搜索字符串时,假设我搜索 Mary,输入搜索为“mary”,然后找不到数据。即不区分大小写。我怎么做 ?同样,当我将 Age 设为 31 时,我将其转换为整数,这给了我错误

#!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 in self.fname

    def searchLName(self, matchString):
        return matchString in self.lname

    def searchAge(self, matchString):      
        return matchString in self.age

    def searchGender(self, matchString):        
       return matchString in self.gender

   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]

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 = int(raw_input("Enter Age :"))
    if StringSearch > 100:
        print "Please enter valid age"

    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)

错误 :

Enter for Search Criteria
1.FirstName  2.LastName  3.Age  4.Gender  5.Exit 3
Enter Age :41
Traceback (most recent call last):
  File "TestObjectSearch.py", line 143, in <module>
    if records.searchAge(StringSearch):
  File "TestObjectSearch.py", line 77, in searchAge
    return matchString in self.age
TypeError: 'in <string>' requires string as left operand
4

4 回答 4

1

如果 matchString 需要是一个 int,你可以这样做:

def searchAge(self, matchString):      
    return str(matchString) in self.age

或在构造函数中将 age 转换为 int 并保持代码不变。

此外,在您的代码中,这部分看起来是错误的:

StringSearch = int(raw_input("Enter Age :"))
for records in list_of_records:
if records.searchGender(StringSearch):
    found = True
    records.display()

您要求年龄,但您调用 .searchGender()

于 2013-10-22T09:57:46.683 回答
1

对于任何不区分大小写的搜索,将两个字符串都设为可比较的相同大小写(但保留原始字符串大小写)

st = "aAbBLKJkjdsJKJKJKfdfs"
to_find = "aabb"

if to_find.lower() in st.lower():
    print "String Found"

这里,

to_find.lower() and st.lower()

不会改变原始字符串

于 2013-10-22T10:08:07.580 回答
0

错误似乎很清楚:matchString in self.age需要matchString是一个字符串。但是在搜索年龄时,您将输入显式转换为整数。如果你想用它来搜索一个字符串,你不应该那样做。

于 2013-10-22T09:51:52.027 回答
0

为了将年龄保持为整数,您需要在 Person 类中更改init () 方法和 searchAge() 方法,如下所示:

class Person:

    def __init__(self, firstname=None, lastname=None, age=None, gender=None):
    ...
    self.age = int(age) # Convert from string to int

    ...

    def searchAge(self, matchString):      
        return matchString == self.age # Check int against int

为了进行不区分大小写的搜索,您可以这样做:

def searchFName(self, matchString):
    return matchString.lower() in self.fname.lower()
于 2013-10-22T10:12:41.773 回答