2015-09-22 50 views
1

我想做一個python聯繫人管理器,並且我做了一個搜索contacts.txt文件的函數。它可以成功地找到'你',或者列表上的第一個聯繫人,但它找不到其他人。我不知道爲什麼或如何發生這種情況。Python在第一行以外的任何行上找不到短語?

功能

def readFile(self): 

    f = open('contacts.txt', 'r') 
    lines = f.readlines() 
    cmd = str(input("Type in a contact REFERENCE name.\n")) 
    lookup = cmd 

    with open('contacts.txt') as myFile: 
     for num, line in enumerate(myFile, 1): 
      if lookup.upper() in line: 

       print(lines[num - 1]) 
       print(lines[num]) 
       print(lines[num + 1]) 
       print(lines[num + 2]) 
       print(lines[num + 3]) 

       self.managerMenu() 

      else: 
       print("Contact not found.") 
       self.managerMenu() 

contacts.txt

Contact: YOU 
    First Name: FELIX 
    Last Name: MARTIN 
    Number: (555)-555-5555 
    Address: 123 SESAME STREET 
Contact: DAD 
    First Name: JOHN 
    Last Name: SMITH 
    Number: (555)-555-5555 
    Address: 123 SESAME STREET 

當我運行該文件,打字readfile然後you產生這樣的:

Available Commands: Info, ReadFile, DeleteContact, EditContact, AddContact, quit() 
readfile 
Type in a contact REFERENCE name. 
you 
Contact: YOU 

    First Name: FELIX 

    Last Name: MARTIN 

    Number: (555)-555-5555 

    Address: 123 Sesame Street 

但是,當我做同樣的事情與DAD聯繫:

Available Commands: Info, ReadFile, DeleteContact, EditContact, AddContact, quit() 
readfile 
Type in a contact REFERENCE name. 
dad 
Contact not found. 

我在c9.io上運行Python 3.4。任何幫助將不勝感激。

+0

什麼是'self.managerMenu()'? –

+0

你爲什麼要讀這個文件兩次?你可以閱讀所有的行,並且一次使用這個列表或者一個列表,就像你以後做的那樣(更好) – Pynchia

+0

註釋掉'self.managerMenu()' - 我敢打賭它干擾你的循環 – Gerrat

回答

2

問題是你正在檢查每行是否lookup.upper()是否在該行,如果是,你打印,如果不是你打電話self.managerMenu(),我猜在你的程序打印出菜單。

反正你打電話給self.managerMenu(),所以你應該在完全通過文件後才能調用它。示例 -

def readFile(self): 

    f = open('contacts.txt', 'r') 
    lines = f.readlines() 
    cmd = str(input("Type in a contact REFERENCE name.\n")) 
    lookup = cmd 

    with open('contacts.txt') as myFile: 
     for num, line in enumerate(myFile, 1): 
      if lookup.upper() in line: 

       print(lines[num - 1]) 
       print(lines[num]) 
       print(lines[num + 1]) 
       print(lines[num + 2]) 
       print(lines[num + 3]) 
       break 
     else: 
      print("Contact not found.") 
    self.managerMenu() 

請注意,我搬到了else以相同的縮進水平for循環,這使得它for..else結構,如果我們不使用break打破循環的else塊只執行,這將意味着我們沒有找到任何匹配的行。

再次讀取文件兩次將是非常低效的,您可以改爲使用iter()爲該文件創建一個迭代器。示例 -

def readFile(self): 

    lookup = input("Type in a contact REFERENCE name.\n") 

    with open('contacts.txt') as myFile: 
     my_file_iter = iter(myFile) 
     for num, line in enumerate(my_file_iter, 1): 
      if lookup.upper() in line: 

       print(line) 
       print(next(my_file_iter)) 
       print(next(my_file_iter)) 
       print(next(my_file_iter)) 
       print(next(my_file_iter)) 
       break 
     else: 
      print("Contact not found.") 
    self.managerMenu() 

請注意,如果self.managerMenu()真是越來越從那裏你可以再次降臨到這個readFile(self)方法打印菜單,那麼這將是一個糟糕的方式運行程序一段時間後做的菜單,因爲你的堆棧會很大(因爲你正在使用菜單遞歸),並且退出也很複雜。我建議你改用while循環。

+0

第二種解決方案('iter()')有效。謝謝! –

0

不會真的看到任何會導致您所描述的行爲的東西,但是我會在if語句中創建line.upper(),以便您絕對確信它會忽略大寫字母在雙方。以防萬一contacts.txt可能是DaD或爸爸而不是DAD。

-1

這聽起來像是一個更好的正則表達式的工作。考慮下面的例子。

import re 
contacts_text = """Contact: YOU 
    First Name: FELIX 
    Last Name: MARTIN 
    Number: (555)-555-5555 
    Address: 123 SESAME STREET 
Contact: DAD 
    First Name: JOHN 
    Last Name: SMITH 
    Number: (555)-555-5555 
    Address: 123 SESAME STREET""" 
parsed_contacts = re.compile(r'(?i)(\s*contact\s*:?\s*)(\w*)(.*?)(?=contact|$)', flags=re.DOTALL).findall(contacts_text) 
contacts = {} 
search_fields = {'First Name': r'(?i)(\s*first\s*name\s*:?\s*)(.*?)(\n)', 
       'Last Name': r'(?i)(\s*last\s*name\s*:?\s*)(.*?)(\n)', 
       'Number': r'(?i)(\s*number\s*:?\s*)(.*?)(\n)', 
       'Address': r'(?i)(\s*address\s*:?\s*)(.*?)(\n)'} 

for pc in parsed_contacts: 
    contact_header = pc[1] 
    contacts[contact_header] = {} 
    for seach_id, regex in search_fields.items(): 
     match_obj = re.search(regex, pc[2]) 
     if match_obj: 
      contacts[contact_header][seach_id] = match_obj.group(2) 
     else: 
      contacts[contact_header][seach_id] = None 
print contacts 
相關問題