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