遍历文件夹更新 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("操作完成,但保存结果时出现问题") 可以以此为模板,碰到合适场景可以直接使用。