Python 大脑要爆炸了。需要搜索外部文件并返回多个结果
我不会说谎的。我正试着做一项作业,却被它打败了 我需要python提示用户输入房间号,然后在提供的.txt文件中查找该房间号,该文件包含csv[逗号分隔值],如果有,则显示多个结果 我能够让python返回第一个结果ok,但随后它停止了。我通过使用散列命令和Python 大脑要爆炸了。需要搜索外部文件并返回多个结果,python,Python,我不会说谎的。我正试着做一项作业,却被它打败了 我需要python提示用户输入房间号,然后在提供的.txt文件中查找该房间号,该文件包含csv[逗号分隔值],如果有,则显示多个结果 我能够让python返回第一个结果ok,但随后它停止了。我通过使用散列命令和.split(我宁愿将其作为csv读取,尽管我无法使其工作。)来解决csv问题。我必须编辑外部文件,使数据以逗号分隔,以分号分隔,这并不理想,因为我不应该弄乱提供的文件 无论如何。。。 我的外部文件如下所示: Roombooks.txt 6-
.split
(我宁愿将其作为csv读取,尽管我无法使其工作。)来解决csv问题。我必须编辑外部文件,使数据以逗号分隔,以分号分隔,这并不理想,因为我不应该弄乱提供的文件
无论如何。。。
我的外部文件如下所示:
Roombooks.txt
6-3-07;L1;MSW001;1
6-3-07;L2;MSP201;1
6-3-07;L3;WEB201;1
6-3-07;L4;WEB101;1
6-3-07;L5;WEB101;1
7-3-07;L1;MSW001;2
7-3-07;L2;MSP201;2
7-3-07;L3;WEB201;2
7-3-07;L4;WEB101;2
7-3-07;L5;WEB101;2
8-3-07;L1;WEB101;1
8-3-07;L2;MSP201;3
我的代码是这样的:
roomNumber = (input("Enter the room number: "))
def find_details(id2find):
rb_text = open('roombookings.txt', 'r')
each_line = rb_text.readline()
while each_line != '':
s = {}
(s['Date'], s['Room'], s['Course'], s['Stage']) = each_line.split(";")
if id2find == (s['Room']):
rb_text.close()
return(s)
each_line = rb_text.readline()
rb_text.close()
room = find_details(roomNumber)
if room:
print("Date: " + room['Date'])
print("Room: " + room['Room'])
print("Course: " + room['Course'])
print("Stage: " + room['Stage'])
如果我运行该程序,系统会提示我输入房间号。如果我进入,说“L1”
我得到:
我应该得到3个积极的匹配。我猜我的环断了?请帮我保持理智
编辑。我已经尝试了这里的解决方案,但一直在破坏程序(我想我没有正确关闭文件?)或给我错误。我两天来一直在认真地整理这件事,并记住我的水平很低。我读过多本教科书,做过很多谷歌搜索,但恐怕我还是无法理解。不过我还是很感谢您的帮助。首先。要迭代文件中的行,请使用“下一步”:
for line in rb_text:
# do something
第二。函数在第一次匹配后返回。它如何匹配多个记录?也许你需要这样的东西:
def find_details(id2find):
rb_text = open('roombookings.txt', 'r')
for line in rb_text:
s = {}
(s['Date'], s['Room'], s['Course'], s['Stage']) = line.split(";")
if id2find == (s['Room']):
yield s
rb_text.close()
然后:
for room in find_details(roomNumber):
print("Date: " + room['Date'])
print("Room: " + room['Room'])
print("Course: " + room['Course'])
print("Stage: " + room['Stage'])
是的,您最好先使用一些CSV解析器。。要迭代文件中的行,请使用“下一步”:
for line in rb_text:
# do something
第二。函数在第一次匹配后返回。它如何匹配多个记录?也许你需要这样的东西:
def find_details(id2find):
rb_text = open('roombookings.txt', 'r')
for line in rb_text:
s = {}
(s['Date'], s['Room'], s['Course'], s['Stage']) = line.split(";")
if id2find == (s['Room']):
yield s
rb_text.close()
然后:
for room in find_details(roomNumber):
print("Date: " + room['Date'])
print("Room: " + room['Room'])
print("Course: " + room['Course'])
print("Stage: " + room['Stage'])
是的,您最好使用一些CSV解析器。您的问题是
查找详细信息()中的返回。一旦您找到一个条目,您就要离开该函数。你甚至不关闭文件。一种解决方案是在开始时使用空列表,例如results=[]
,然后附加符合您要求的所有条目(results.append)
。您的问题是查找详细信息()中的返回。一旦您找到一个条目,您就要离开该函数。你甚至不关闭文件。一种解决方案是在开始时使用空列表,例如results=[]
,然后附加所有符合您要求的条目(results.append)
)。当“id2find”参数第一次与文件室完全相等时,您的代码会返回
如果需要多个匹配项,可以在进入循环之前创建一个空列表,将每个匹配项附加到列表中而不返回,返回列表,然后使用for循环打印每个匹配项。当“id2find”参数第一次与文件室完全相等时,您的代码会返回
如果需要多个匹配项,可以在进入循环之前创建一个空列表,将每个匹配项附加到列表中而不返回,返回列表,然后使用for循环打印出每个匹配项。你得到了你写的内容…你在找到第一个命中后将离开循环…你还期望什么???有一个模块提示:使用python csv reader简化文件读取。你得到了你写的内容…你在找到第一个命中后将离开循环…你还期望什么???有一个moduletip:使用PythonCSV阅读器简化文件读取。对于这一级别,这可能是更好的解决方案yield
语句可能很方便,但对询问者来说也可能有点过头了。这可能是这个级别的更好解决方案<代码>收益率
语句可能很方便,但对提问者来说也可能有点过头了。感谢您的帮助,非常感谢。我尝试了你的解决方案,但是在第一个结果的12个副本中搜索“L1”结果。搜索L2-L5不会返回任何结果。?我还需要在open命令下添加一个“each_line=rb_text.readline()”,因为它告诉我没有定义each_line.split?感谢您的帮助,非常感谢。我尝试了你的解决方案,但是在第一个结果的12个副本中搜索“L1”结果。搜索L2-L5不会返回任何结果。?我还需要在open命令下添加一个“each_line=rb_text.readline()”,因为它告诉我没有定义each_line.split?