2013-10-21 154 views
0

假设特定领域我有一个名为abc.txt文件,其中包含了以下数据。我是一个新手。所以,请大家帮忙搜索文本文件

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

fnamelnameagegender与他们相关的指标?因为我的要求是,如果用户选择通过名字搜索条件,应该在第一名称列只搜索或选择查询条件如性别,它应该在性别搜索和显示整个记录。我该怎么做呢?

#!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 display(self): 
     found = False 

     n1 = raw_input("Enter for Search Criteria\n1.FirstName == 2.LastName ==  3.Age == 4.Gender : ") 

     print "Not a valid input" 
     if n1.isdigit(): 
      n = int(n1) 
     else: 
      print "Enter Integer only" 

     if n == 0 or n>4: 
      print "Enter valid search " 

     if n == 1: 
      StringSearch = raw_input("Enter FirstName :") 
      for records in list_of_records: 
       if StringSearch in records.fname: 
        found = True 
        print records.fname, records.lname, records.age, records.gender 

      if not found: 
       print "No matched record" 

     if n == 2: 
      StringSearch = raw_input("Enter LastName :") 
      for records in list_of_records: 
       if StringSearch in records.lname: 
        found = True 
        print records.fname, records.lname, records.age, records.gender 

      if not found: 
       print "No matched record" 

     if n == 3: 
      StringSearch = raw_input("Enter Age :") 
      for records in list_of_records: 
       if StringSearch in records.age: 


     if not found: 
      print "No matched record" 

     if n == 4: 
      StringSearch = raw_input("Enter Gender(M/F) :") 
      for records in list_of_records: 
       if StringSearch in records.gender: 
        found = True 
        print records.fname, records.lname, records.age, records.gender 

      if not found: 
      print "No matched record" 



f= open("abc","r") 
list_of_records = [Person(*line.split()) for line in f] 
#for record in list_of_records: 


for per in list_of_records: 
    per.display() 

回答

1

如果您想通过特定的信息进行搜索,您可以这样做。所以说,用户希望通过firstnameJohn进行搜索。这是你会怎么做:

#!usr/bin/python 
import sys 
class Records: 
    def __init__(self, firstname, lastname, age, gender): 
     self.fname = firstname 
     self.lname = lastname 
     self.age = age 
     self.gender = gender 

f= open("abc","r") 
list_of_records = [Records(*line.split()) for line in f] 
search_term = "John" 
for record in list_of_records: 
    if record.firstname == search_term: 
     print "We found him!" 
     print record.firstname, record.lastname, record.age, record.gender 

如果用户给了双方一个firstnamegender,那么你可以做这样的事情:

for record in list_of_records: 
    if record.firstname == "John" and record.gender = "M": 
     print "We found him!" 
     print record.firstname, record.lastname, record.age, record.gender 

同时,始终记住关闭文件流,所以当你打电话open,你实际上是在脚本的末尾打开一个文件流,所以,总是关闭它们,像这样f.close()。如果你使用with,那么你并不需要担心关闭。

0

更紧凑和灵活的解决方案,可以从标准库使用namedtuple类型:

import collections 

record_tuple = collections.namedtuple('Record', 
         ['Firstname', 'Lastname', 'Age', 'Gender']) 

n = raw_input("Enter %s :" % ' '.join('%s.%s' % (i, name) for i, name in enumerate(record_tuple._fields, 1))) 
n = int(n) 

StringSearch = raw_input('Enter %s :' % record_tuple._fields[n-1]) 

for line in open('abc'): 
    record = record_tuple(*line.split()) 
    if record[n-1] == StringSearch: 
     print ' '.join(record) 

这样,您就可以概括的搜索代码。