2016-03-25 86 views
1

我正在嘗試編寫一個函數,允許用戶輸入名稱或電話號碼,檢查它是否存在於文件中,以及是否打印在找到該元素的整個行中。我至今:如果在Python中找到部分行,從文件打印行

def searchPlayer(): 
    with open("players.txt") as f: 
     data = f.readlines() 
     print "Enter 0 to go back" 
     nameSearch = str(raw_input("Enter player surname, forname, email, or phone number: ")) 

     if any(nameSearch in s for s in data): 
      #Finding the element in the list works 
      #Can't think of a way to print the entire line with the player's information 
     else: 
      print nameSearch + " was not found in the database" 

文件的格式像這樣:

Joe;Bloggs;[email protected];0719451625 
Sarah;Brown;[email protected];0749154184 

所以,如果nameSearch ==喬,輸出應該是Joe;Bloggs;[email protected];0719451625

任何幫助,將不勝感激,謝謝

+1

問題是'any(...)'不會告訴你哪一行匹配。將它解開成一個循環,你會發現它更容易做到。 – alexis

回答

2

爲什麼不使用循環?

for s in data: 
    if nameSearch in s: 
     print s 
     break 

any無論如何循環,從docs

def any(iterable): 
    for element in iterable: 
     if element: 
      return True 
    return False 
+0

它會循環,但會短路(您需要在循環中添加一個「break」以使其等同),而在CPython(參考解釋器)中,它以C語言實現,這可以使其大大快於拼出循環。當然,如果它沒有做你所需要的,那就沒有幫助。 :-) – ShadowRanger

+0

你是對的,編輯 - 我不知何故錯過了回報大聲笑,我想你也可以說'return print(s)' – Bahrom

1

似乎太複雜,只是做

with open("players.txt") as f: 
    for line in f: 
    if nameSearch in line: 
     print line 
0

正如評論@alexis提到的,你不應該使用any()如果你想知道哪一行匹配。如果你只想打印第一場比賽,break之前取出井號,並更改if not found:else:

found = False 
for s in data: 
    if nameSearch in s: 
     print s 
     found = True 
     #break # Optional. Put this in if you want to print only the first match. 

if not found: 
    print "{} was not found in the database".format(nameSearch) 

:在這種情況下,你應該使用,而不是一個循環。

1

您不能像其他人所說的那樣使用any,但如果您想保留更緊湊的代碼,則可以使用next。相反的:

if any(nameSearch in s for s in data): 

你會使用next with a default value

entry = next((s for s in data if nameSearch in s), None) 
if entry is not None: 
    print entry, 
else: 
    print nameSearch, "was not found in the database" 

注意:您可能需要使用csv.reader等來這裏解析,否則你最終會誤格式化的數據;如果用戶輸入;,即使;正在格式化,您將盲目地返回第一條記錄,而不是字段數據。同樣,搜索Jon會發現第一個人名爲JonJonathan或可能存在以Jon開頭的任何其他名稱。

相關問題