我正在尝试编写一个函数,允许用户输入姓名或电话号码,检查它是否存在于文件中,以及是否打印出找到该元素的整行。到目前为止:
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;j.bloggs@anemailaddress.com;0719451625
Sarah;Brown;s.brown@anemailaddress.com;0749154184
因此,如果nameSearch==Joe,则输出应该是Joe;Bloggs;j.bloggs@anemailaddress.com;0719451625
如有任何帮助,我们将不胜感激,谢谢
为什么不使用循环?
for s in data:
if nameSearch in s:
print s
break
any
无论如何都在循环,从文档:
def any(iterable):
for element in iterable:
if element:
return True
return False
看起来太复杂了,只需要做
with open("players.txt") as f:
for line in f:
if nameSearch in line:
print line
您不能像其他人提到的那样使用any
,但如果您想保持更紧凑的代码,可以使用next
。代替:
if any(nameSearch in s for s in data):
您可以使用默认值为的next
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
的搜索将找到名为Jon
或Jonathan
的第一个人,或者可能存在的以Jon
开头的任何其他名字。
正如注释中提到的@alexis,如果您想知道哪一行匹配,就不应该使用any()
。在这种情况下,您应该使用一个循环:
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)
如果只想打印第一个匹配项,请去掉break
之前的哈希符号,并将if not found:
更改为else:
。