【问题标题】:correct positioning if statement in a function with for loop在带有 for 循环的函数中正确定位 if 语句
【发布时间】:2021-01-17 14:16:55
【问题描述】:

我正在尝试执行以下代码,在文本文件中搜索 mac 地址,如果找到它会询问用户是否要根据找到的 IP 和密码调用 API 来检索设备信息。此外,它还为用户提供了开始新搜索或退出的选项。

如果搜索匹配,这部分会完美运行。搜索不匹配时的问题! 它在第一次试验中正确执行“未找到匹配项!”,然后再次执行该函数,但如果用户再次输入一个没有匹配项的 mac 地址,则代码不会再次重新执行并结束程序。

下面是代码

import http.client
from base64 import b64encode
import ssl
import json


def search_mac():
    with open(r"C:\Users\afahmy\Desktop\final.txt", "r") as output_file:
        search = input("Enter mac-address: ")
        search = search.lower().replace(':', '')
        for line in output_file:
            ip = line.split(',')[0]
            # print(ip)
            password = line.split(',')[1]
            # print(password)
            mac = line.split(',')[2].rstrip()
            # print(mac)
            if search == mac:
                print(format("IP:" + ip + "\n" + "password:" + password))
                if input("Do you want to retrieve device information?[y/n]") == 'y':
                    ssl._create_default_https_context = ssl._create_unverified_context
                    auth_string = "Polycom:"
                    admin_password = auth_string + password
                    conn = http.client.HTTPSConnection(ip)
                    userandpass = b64encode(admin_password.encode('UTF-8')).decode('ascii')
                    headers = {'Authorization': 'Basic %s' % userandpass}
                    conn.request("GET", "/api/v1/mgmt/device/info", headers=headers)
                    res = conn.getresponse()
                    data = res.read()
                    json_format = json.loads(data)
                    dictionary = json_format["data"]
                    dictionary_new = {k: dictionary[k] for k in dictionary.keys() - {'IPV6Address', 'DeviceType', 'DeviceVendor', 'AttachedHardware'}}
                    for item in dictionary_new.items():
                        print(item)
                if input("Do you want to make another search?[y/n]:") == 'y':
                    search_mac()
                else:
                    print("Thank you!")
                    exit()


search_mac()
print("No Match!")
if input("Do you really want to make another search?[y/n]:") == 'y':
    search_mac()
else:
    print("Thank you for your time!")

这是我第一次输入不正确的mac地址(效果很好)和第二次(这是问题)时的输出。

Enter mac-address: 64167f185bf30000 <<<< i added 4 zeros to be a wrong one
No Match!
Do you really want to make another search?[y/n]:y
Enter mac-address: 64167f185bf3     <<<< entered a correct one
IP:10.10.10.4
password:Password!
Do you want to retrieve device information?[y/n]n
Do you want to make another search?[y/n]:y
Enter mac-address: 64167f185bf300   <<<< again a mac address that does not have a match

Process finished with exit code 0

【问题讨论】:

    标签: python function for-loop if-statement


    【解决方案1】:

    代码运行良好!

    您正在等待不匹配,真的吗?您需要将print("No Match!") 移动到def search_mac()

    代码在 de 函数外打印第一个“不匹配”,但查看 de 函数内部,没有“不匹配”。这是开发人员的逻辑错误,但代码正在完成他的工作

    在这里可以快速实现您的工作。但是这段代码非常基础,可能有逻辑错误,可以改进:

    • 处理重复的macs
    • 退出捕获信号的真正循环
    • 文件只读一次
    • 内存泄漏,你可以打开亿万次search_mac()而不用关闭老用户
    def search_mac():
        with open(r"C:\Users\afahmy\Desktop\final.txt", "r") as output_file:
            found = False
            search = input("Enter mac-address: ")
            search = search.lower().replace(':', '')
            for line in output_file:
                ip = line.split(',')[0]
                # print(ip)
                password = line.split(',')[1]
                # print(password)
                mac = line.split(',')[2].rstrip()
                # print(mac)
                if search == mac:
                    print(format("IP:" + ip + "\n" + "password:" + password))
                    if input("Do you want to retrieve device information?[y/n]") == 'y':
                        ssl._create_default_https_context = ssl._create_unverified_context
                        auth_string = "Polycom:"
                        admin_password = auth_string + password
                        conn = http.client.HTTPSConnection(ip)
                        userandpass = b64encode(admin_password.encode('UTF-8')).decode('ascii')
                        headers = {'Authorization': 'Basic %s' % userandpass}
                        conn.request("GET", "/api/v1/mgmt/device/info", headers=headers)
                        res = conn.getresponse()
                        data = res.read()
                        json_format = json.loads(data)
                        dictionary = json_format["data"]
                        dictionary_new = {k: dictionary[k] for k in dictionary.keys() - {'IPV6Address', 'DeviceType', 'DeviceVendor', 'AttachedHardware'}}
                        found = True
                        for item in dictionary_new.items():
                            print(item)
                        break
            if not found:
                print("No Match!")
            if input("Do you want to make another search?[y/n]:") == 'y':
                search_mac()
            else:
                print("Thank you for your time!")
                exit(0)
    
    search_mac()```
    
    

    【讨论】:

    • 感谢详细回复,其实是我写的代码,但我还是python的初学者。当我使用您的修改运行代码时,如果我输入正确的 mac 地址,它会打印(不匹配!),直到它在匹配后中断。如果我输入了错误的 mac,它会打印(不匹配!)与文本行一样多。在提示下一个问题之前。我不想要这种行为,如果有匹配我只想打印出(IP,密码)。
    • 哦,你是真的...好的,我将编辑回复...现在试试!
    • @gillito 谢谢伙计,这很有帮助!我做了一点修改,现在所有的测试都成功通过了!再次感谢。
    【解决方案2】:

    非常感谢@gilito!代码的工作原理像 95% 正确,除了它打印不匹配!在新的提示之后

    输出:

    Enter mac-address: 64167f185bf3
    IP:10.10.10.5
    password:Password!
    Do you want to retrieve device information?[y/n]n
    No Match!    <<<<<<<<<<< unwanted line
    Do you want to make another search?[y/n]:
    

    我在您所做的修改的基础上进行了构建,并添加了一个 while 循环来检查用户是否想要进行新的搜索,如果不想要则退出程序。

    所以完整的工作代码如下

    def search_mac():
        with open(r"C:\Users\afahmy\Desktop\final.txt", "r") as output_file:
            found = False
            search = input("Enter mac-address: ")
            search = search.lower().replace(':', '')
            for line in output_file:
                ip = line.split(',')[0]
                # print(ip)
                password = line.split(',')[1]
                # print(password)
                mac = line.split(',')[2].rstrip()
                # print(mac)
                if search == mac:
                    print(format("IP:" + ip + "\n" + "password:" + password))
                    entry = input("Do you want to retrieve device information?[y/n]")
                    while entry == 'y':
                        ssl._create_default_https_context = ssl._create_unverified_context
                        auth_string = "Polycom:"
                        admin_password = auth_string + password
                        conn = http.client.HTTPSConnection(ip)
                        userandpass = b64encode(admin_password.encode('UTF-8')).decode('ascii')
                        headers = {'Authorization': 'Basic %s' % userandpass}
                        conn.request("GET", "/api/v1/mgmt/device/info", headers=headers)
                        res = conn.getresponse()
                        data = res.read()
                        json_format = json.loads(data)
                        dictionary = json_format["data"]
                        dictionary_new = {k: dictionary[k] for k in dictionary.keys() - {'IPV6Address', 'DeviceType', 'DeviceVendor', 'AttachedHardware'}}
                        found = True
                        for item in dictionary_new.items():
                            print(item)
                        break
                    else:
                        if input("Do you want to make another search?[y/n]:") == 'y':
                            search_mac()
                        else:
                            print("Thank you for your time!")
                            exit(0)
            if not found:
                print("No Match!")
            if input("Do you want to make another search?[y/n]:") == 'y':
                search_mac()
            else:
                print("Thank you for your time!")
                exit(0)
    
    
    search_mac()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2015-04-21
      • 1970-01-01
      相关资源
      最近更新 更多