Python遍历文件夹JSON文件时遇FileNotFoundError问题求助
问题解决:遍历文件夹JSON文件时的FileNotFoundError及完整实现
你的FileNotFoundError是因为os.walk返回的file只是单纯的文件名,不是文件的完整路径。直接用open(file, 'r')时,Python会在当前脚本的工作目录查找文件,而非你指定的目标文件夹子目录,因此找不到文件。
下面是修正后的完整代码(完全基于Python标准库),同时整合了CIDR与IP的匹配逻辑:
import json import os from ipaddress import ip_network, ip_address def is_ip_in_cidr(ip_str, cidr_str): """检查IP是否在指定CIDR范围内""" try: ip = ip_address(ip_str) network = ip_network(cidr_str, strict=False) return ip in network except ValueError: print(f"无效的IP或CIDR格式: IP={ip_str}, CIDR={cidr_str}") return False # 获取用户输入的IP print("请输入要查询的IP地址: ") target_ip = input().strip() # 目标文件夹路径 working_directory = '/Desktop/ExampleFolder' # 遍历文件夹及其子目录下的所有JSON文件 found_match = False for subdir, dirs, files in os.walk(working_directory): for file in files: if file.endswith('.json'): # 拼接文件完整路径 full_file_path = os.path.join(subdir, file) try: with open(full_file_path, 'r') as json_file: data = json.load(json_file) # 获取CIDR列表(兼容键不存在的情况) cidr_list = data.get('JsonKey', []) if not isinstance(cidr_list, list): print(f"文件 {full_file_path} 中的'JsonKey'不是列表格式") continue # 检查当前文件内的所有CIDR for cidr in cidr_list: if is_ip_in_cidr(target_ip, cidr): print(f"匹配成功: IP {target_ip} 在CIDR {cidr} 中,来自文件 {full_file_path}") found_match = True break # 找到匹配,跳出当前文件的CIDR循环 if found_match: break # 找到匹配,跳出文件遍历循环 except json.JSONDecodeError: print(f"文件 {full_file_path} 不是有效的JSON格式") except Exception as e: print(f"处理文件 {full_file_path} 时出错: {str(e)}") if found_match: break # 找到匹配,跳出目录遍历循环 if not found_match: print(f"未找到与IP {target_ip} 匹配的CIDR") print("祝你愉快。")
关键修正点说明
- 文件路径拼接:用
os.path.join(subdir, file)生成完整文件路径,解决文件找不到的核心问题 - 异常处理:增加了无效JSON、无效IP/CIDR格式等异常的捕获,提升代码健壮性
- 匹配逻辑优化:找到匹配后提前终止多层遍历,减少不必要的计算
- 键安全访问:用
data.get('JsonKey', [])避免JSON中不存在目标键时抛出KeyError - CIDR兼容性:
ip_network添加strict=False,支持非严格格式的CIDR(如192.168.1.0)
内容的提问来源于stack exchange,提问作者codingparamedic
相关产品推荐
相关产品推荐

