如何使用argparse实现同时支持stdin、文件或目录作为输入?
实现同时支持 stdin、文件或目录输入的 argparse 配置
要实现三者互斥的输入支持,核心思路是用可选位置参数(nargs='?')接收路径,再手动判断输入类型:无参数时读取 stdin,有参数时区分文件/目录。以下是具体实现方案:
完整代码示例
import argparse import os import sys def main(): parser = argparse.ArgumentParser(description="支持从stdin、单个文件或单个目录读取输入") # 可选位置参数:不传则使用stdin,传则为文件/目录路径 parser.add_argument('input', nargs='?', help="输入文件路径、目录路径,留空则从标准输入读取") args = parser.parse_args() if args.input is None: # 处理stdin输入 print("读取标准输入内容:") for line in sys.stdin: # 替换为你的业务逻辑 print(line.strip()) else: full_path = os.path.abspath(args.input) if not os.path.exists(full_path): print(f"错误:路径 {full_path} 不存在", file=sys.stderr) sys.exit(1) if os.path.isfile(full_path): # 处理单个文件 print(f"读取文件:{full_path}") with open(full_path, 'r') as f: for line in f: # 替换为你的业务逻辑 print(line.strip()) elif os.path.isdir(full_path): # 处理目录(示例为遍历目录下所有文件) print(f"遍历目录:{full_path}") for filename in os.listdir(full_path): file_path = os.path.join(full_path, filename) if os.path.isfile(file_path): print(f"发现文件:{file_path}") # 这里可添加读取文件的逻辑 if __name__ == "__main__": main()
关键细节说明
nargs='?'的作用:让位置参数变为可选——用户可以不传参数(此时args.input为None),或传一个参数(文件/目录路径),正好对应三者之一的输入需求。- 放弃
argparse.FileType:因为该类型只能识别合法文件,无法处理目录,所以改用手动判断路径类型,灵活性更高。 - 路径合法性检查:先通过
os.path.exists验证路径存在,避免后续报错;再用os.path.isfile和os.path.isdir区分文件/目录。 - 错误处理:路径不存在时输出错误信息到标准错误流,并退出程序,符合命令行工具的规范。
使用示例
- 从 stdin 读取:
echo "测试内容" | python your_script.py - 读取单个文件:
python your_script.py test.txt - 读取目录:
python your_script.py ./test_dir
内容的提问来源于stack exchange,提问作者Ahmad Ismail
相关产品推荐
相关产品推荐

