遍历文件夹更新 JSON 文件内容

最近,有一个需求,需要从根目录下查找子文件夹,如果子文件夹下的文件是.md 后缀,并且在原始的 data.json 数据中存在,则取出来生成新的对象。然后存入到 data-temp.json 文件中。

使用 Python 实现的,真的很方便。如果自己复制粘贴,需要好长时间,但是使用脚本一秒就够了。

import os
import json
import re
from typing import List, Dict

# 固定路径配置
SCAN_DIR = "扫描目录"
JSON_FILE = "原始JSON数据文件"
OUTPUT_FILE = "存入JSON数据文件"

def is_valid_folder(folder_name: str) -> bool:
    """检查文件夹名是否不包含数字"""
    return not bool(re.search(r'\d', folder_name))

def find_matching_files() -> List[Dict]:
    """
    查询指定目录下的子文件夹(排除含数字的),查找.md文件,并从JSON文件中查找匹配的记录
    """
    # 读取并预先加载JSON文件
    try:
        print(f"正在加载JSON文件: {JSON_FILE}")
        with open(JSON_FILE, 'r', encoding='utf-8') as f:
            json_data = json.load(f)

        # 创建以id为键的字典提高查询效率
        id_map = {str(item.get('id')): item for item in json_data if isinstance(item, dict) and 'id' in item}
        print(f"成功加载 {len(id_map)} 条JSON记录")
    except FileNotFoundError:
        print(f"错误:JSON文件 {JSON_FILE} 未找到")
        return []
    except json.JSONDecodeError:
        print(f"错误:JSON文件 {JSON_FILE} 格式不正确")
        return []
    except Exception as e:
        print(f"加载JSON数据时出错: {e}")
        return []

    results = []
    valid_folders = []

    print(f"\n开始扫描目录: {SCAN_DIR}")

    # 遍历根目录下的所有子文件夹
    for category in os.listdir(SCAN_DIR):
        # 跳过包含数字的文件夹
        if not is_valid_folder(category):
            continue

        subdir_path = os.path.join(SCAN_DIR, category)

        # 确保是目录
        if not os.path.isdir(subdir_path):
            continue

        valid_folders.append(category)
        print(f"发现有效分类目录: {category}")

        # 遍历子目录中的.md文件
        for filename in os.listdir(subdir_path):
            # 只处理.md文件
            if not filename.endswith('.md'):
                continue

            # 使用完整的文件名(保留.md后缀)作为ID
            file_id = filename

            # 在预先加载的JSON数据中查找匹配的ID
            if file_id in id_map:
                item = id_map[file_id]
                # 创建记录
                record = {
                    'id': item.get('id'),
                    'name': item.get('name', ''),
                    'category': category,
                    'kw': '',
                    'plat': 'mp',
                    'filename': filename
                }
                results.append(record)
                print(f"匹配成功: {category}/{filename} -> ID {item.get('id')}")

    # 打印扫描摘要
    print("\n扫描完成,结果摘要:")
    print(f" - 有效分类目录: {len(valid_folders)} 个")
    print(f" - 匹配到的文件: {len(results)} 个")

    return results

def save_to_json(data: List[Dict]) -> bool:
    """
    将数据保存为JSON文件
    """
    try:
        with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        print(f"\n结果已保存到: {OUTPUT_FILE}")
        return True
    except Exception as e:
        print(f"\n保存文件时出错: {e}")
        return False

if __name__ == "__main__":
    # 获取匹配结果
    matched_records = find_matching_files()

    # 保存结果
    if save_to_json(matched_records):
        print("操作成功完成")
    else:
        print("操作完成,但保存结果时出现问题")

可以以此为模板,碰到合适场景可以直接使用。