编写Python脚本区分可解析与无DNS解析的服务器
解决方案
你的代码存在几个影响功能的问题:
- 未导入
socket模块,调用socket.gethostbyname会直接报错 break语句会让循环仅执行一次,无法遍历所有服务器- 直接打开文件后未手动关闭,存在资源泄漏风险,建议用
with语句自动管理 - 捕获所有
Exception不够精准,DNS解析失败对应的是socket.gaierror专属异常 - 从文件读取的服务器名会带有换行符,需要先清理才能正常解析
下面是修正后的代码,能将两类服务器分别归类存储:
import socket # 初始化两个列表用于分类存储服务器 resolvable_servers = [] unresolvable_servers = [] # 使用with语句安全读取文件,无需手动关闭 with open("test2.txt", 'r') as servers_file: for server in servers_file: # 去除服务器名首尾的空白字符(换行符、空格等) server_name = server.strip() # 跳过文件中的空行 if not server_name: continue try: # 尝试解析服务器的DNS ip_address = socket.gethostbyname(server_name) # 解析成功,将服务器名和对应IP存入列表 resolvable_servers.append((server_name, ip_address)) except socket.gaierror: # DNS解析失败,存入不可解析列表 unresolvable_servers.append(server_name) # 输出分类结果 print("可正常解析的服务器:") for name, ip in resolvable_servers: print(f"{name} → {ip}") print("\n无法解析的服务器(已从DNS移除):") for name in unresolvable_servers: print(name)
关键说明:
with语句会在代码块结束后自动关闭文件,避免资源泄漏strip()清理服务器名的空白字符,防止因换行符导致解析失败- 精准捕获
socket.gaierror,只处理DNS解析失败的情况,避免误捕获其他异常 - 用两个列表分别存储两类服务器,方便后续进行写入文件、统计分析等操作
- 跳过空行,避免处理文件中的无效空条目
内容的提问来源于stack exchange,提问作者user2091722
相关产品推荐
相关产品推荐

