gpt4 book ai didi

Python 除了第一行之外没有在任何行上找到短语?

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:46 25 4
gpt4 key购买 nike

我正在尝试制作一个 python 联系人管理器,并且我制作了一个搜索 contacts.txt 文件的函数。它可以成功找到“您”,或者列表中应该是您的第一个联系人,但无法找到其他联系人。我不知道为什么或如何发生这种情况。

功能

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()

联系人.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。任何帮助将不胜感激。

最佳答案

问题是对于每一行,您都检查 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 block ,这意味着我们没有找到任何匹配的行。

此外,读取文件两次效率非常低,您可以使用 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) 方法打印的菜单,那么这将是一个执行 menu 的方式不好,因为运行程序一段时间后,您的堆栈会很大(因为您对菜单使用递归),并且退出也会很复杂。我建议您改用 while 循环。

关于Python 除了第一行之外没有在任何行上找到短语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com