如何将JSON文件作为参数传入Python click CLI工具并解析内容
使用Click构建CLI解析指定目录下JSON文件的最佳实践
核心实现思路
通过Click定义CLI参数,结合路径遍历工具筛选JSON文件,再进行解析并处理可能的异常,确保工具健壮性。
步骤与代码示例
安装依赖
确保已安装Click:pip install click完整实现代码
import click import json from pathlib import Path @click.command() @click.argument('target_dir', type=click.Path(exists=True, file_okay=False, dir_okay=True, resolve_path=True)) def parse_json_dir(target_dir): """解析指定目录下所有JSON文件的内容""" dir_path = Path(target_dir) # 遍历目录下所有.json文件(包括子目录) for json_file in dir_path.rglob('*.json'): click.echo(f"正在处理文件: {json_file}") try: with open(json_file, 'r', encoding='utf-8') as f: try: data = json.load(f) # 这里可以添加对JSON数据的处理逻辑,比如打印、验证等 click.echo(f"解析成功,数据结构类型: {type(data)}") # 示例:打印前2个键值对(如果是字典) if isinstance(data, dict): for k, v in list(data.items())[:2]: click.echo(f" {k}: {v}") except json.JSONDecodeError as e: click.echo(f"❌ 解析失败: {str(e)}", err=True) except IOError as e: click.echo(f"❌ 无法打开文件: {str(e)}", err=True) if __name__ == '__main__': parse_json_dir()
关键细节说明
- 参数校验:通过
click.Path的参数确保输入的是存在的目录,resolve_path=True会将路径转为绝对路径,避免相对路径混乱。 - 路径遍历:使用
pathlib.Path.rglob递归遍历所有子目录的JSON文件,若只需遍历当前目录,改用glob即可。 - 异常处理:分别捕获文件IO错误和JSON解析错误,用
click.echo(..., err=True)将错误信息输出到标准错误流,符合CLI工具的规范。 - 扩展性:可以轻松添加选项,比如:
然后在遍历逻辑中根据该选项切换@click.option('--non-recursive', is_flag=True, help='仅遍历当前目录,不包含子目录')glob或rglob。
进阶优化建议
- 如果需要处理超大JSON文件,可改用
json.loads逐行读取(适用于每行一个JSON对象的格式),避免内存占用过高。 - 可添加JSON schema验证,结合
jsonschema库确保文件内容符合预期格式。 - 支持输出处理结果到文件,添加
--output选项指定输出路径。
内容的提问来源于stack exchange,提问作者wlog
相关产品推荐
相关产品推荐

