Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大脑要爆炸了。需要搜索外部文件并返回多个结果_Python - Fatal编程技术网

Python 大脑要爆炸了。需要搜索外部文件并返回多个结果

Python 大脑要爆炸了。需要搜索外部文件并返回多个结果,python,Python,我不会说谎的。我正试着做一项作业,却被它打败了 我需要python提示用户输入房间号,然后在提供的.txt文件中查找该房间号,该文件包含csv[逗号分隔值],如果有,则显示多个结果 我能够让python返回第一个结果ok,但随后它停止了。我通过使用散列命令和.split(我宁愿将其作为csv读取,尽管我无法使其工作。)来解决csv问题。我必须编辑外部文件,使数据以逗号分隔,以分号分隔,这并不理想,因为我不应该弄乱提供的文件 无论如何。。。 我的外部文件如下所示: Roombooks.txt 6-

我不会说谎的。我正试着做一项作业,却被它打败了

我需要python提示用户输入房间号,然后在提供的.txt文件中查找该房间号,该文件包含csv[逗号分隔值],如果有,则显示多个结果

我能够让python返回第一个结果ok,但随后它停止了。我通过使用散列命令和
.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?