如果在Python中找到行的一部分,则从文件打印行
我正在尝试编写一个函数,允许用户输入姓名或电话号码,检查它是否存在于文件中,以及是否打印出找到该元素的整行。到目前为止,我已经:如果在Python中找到行的一部分,则从文件打印行,python,file,search,Python,File,Search,我正在尝试编写一个函数,允许用户输入姓名或电话号码,检查它是否存在于文件中,以及是否打印出找到该元素的整行。到目前为止,我已经: 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,
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;布洛格斯;Jbloggs@anemailaddress.com;0719451625
如果您有任何帮助,我们将不胜感激,谢谢您为什么不使用循环
for s in data:
if nameSearch in s:
print s
break
any
仍在循环,从:
为什么不使用循环呢
for s in data:
if nameSearch in s:
print s
break
any
仍在循环,从:
看起来太复杂了,就这么做吧
with open("players.txt") as f:
for line in f:
if nameSearch in line:
print line
看起来太复杂了,就这么做吧
with open("players.txt") as f:
for line in f:
if nameSearch in line:
print line
正如@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
之前去掉哈希符号,如果未找到,则将更改为,否则:
正如@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
之前取出哈希符号,如果未找到,则将更改为else:
您不能像其他人提到的那样使用任何
,但如果您想保留更紧凑的代码,可以使用next
。而不是:
if any(nameSearch in s for s in data):
您可以使用:
注意:您可能希望在此处使用csv.reader
或类似的方法进行解析,否则会导致数据格式错误;如果用户输入
您将盲目返回第一条记录,即使代码>正在格式化,而不是字段数据。类似地,搜索Jon
会找到名为Jon
或Jonathan
的第一个人,或者可能存在的以Jon
开头的任何其他名字。你不能像其他人提到的那样使用any
,但是如果你想保持更紧凑的代码,你可以使用next
。而不是:
if any(nameSearch in s for s in data):
您可以使用:
注意:您可能希望在此处使用csv.reader
或类似的方法进行解析,否则会导致数据格式错误;如果用户输入
您将盲目返回第一条记录,即使代码>正在格式化,而不是字段数据。类似地,搜索Jon
会找到第一个名为Jon
或Jonathan
的人,或者可能存在的以Jon
开头的任何其他名字。问题是any(…)
没有告诉您哪一行匹配。将其解压到一个循环中,您会发现这样做更容易。问题是any(…)
不会告诉您哪一行匹配。将它解压到一个循环中,你会发现它更容易实现。它会循环,但会短路(你需要在循环中添加一个break
,使其等效),而在CPython(引用解释器)中,它是用C实现的,这可以使它大大快于详细说明的循环。当然,如果它不能满足您的需要,则没有帮助。:-)你是对的,编辑-我不知怎么错过了返回lol,我想你也可以说returnprint(s)
It循环,但它会短路(你需要在循环中添加break
,使其等效),在CPython(引用解释器)中,它是用C实现的,这可以使它大大快于指定的循环。当然,如果它不能满足您的需要,则没有帮助。:-)你是对的,编辑-我不知怎么错过了返回lol,我想你也可以说returnprint(s)