如果在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;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的搜索将找到名为JonJonathan的第一个人,或者可能存在的以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:

最新更新