You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("祝你愉快。")

关键修正点说明

  1. 文件路径拼接:用os.path.join(subdir, file)生成完整文件路径,解决文件找不到的核心问题
  2. 异常处理:增加了无效JSON、无效IP/CIDR格式等异常的捕获,提升代码健壮性
  3. 匹配逻辑优化:找到匹配后提前终止多层遍历,减少不必要的计算
  4. 键安全访问:用data.get('JsonKey', [])避免JSON中不存在目标键时抛出KeyError
  5. CIDR兼容性:ip_network添加strict=False,支持非严格格式的CIDR(如192.168.1.0)

内容的提问来源于stack exchange,提问作者codingparamedic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:21:07