如何基于前缀字符通过argparse实现文本与文件输入兼容?
用argparse实现前缀区分原始文本与文件名输入
当然可以实现,核心思路是给argparse的参数指定自定义类型处理函数,让它自动识别前缀并做对应处理。
具体实现代码
import argparse def data_type(value): if value.startswith('@'): # 去掉@前缀,获取目标文件名 filename = value[1:] try: with open(filename, 'r', encoding='utf-8') as f: return f.read().strip() # 可根据需求去掉strip()保留文件原始格式 except FileNotFoundError: raise argparse.ArgumentTypeError(f"文件 {filename} 不存在") except Exception as e: raise argparse.ArgumentTypeError(f"读取文件 {filename} 失败: {str(e)}") else: # 直接返回原始文本内容 return value def main(): parser = argparse.ArgumentParser(description='区分原始文本与文件名输入的示例') parser.add_argument('-data', type=data_type, required=True, help='输入原始文本或@开头的文件名') args = parser.parse_args() # 此处可直接使用处理后的args.data,两种输入方式结果完全一致 print("处理后的数据:", args.data) if __name__ == '__main__': main()
测试示例
- 创建
filename.txt文件,内容写入raw text - 执行命令:
输出:python program.py -data @filename.txt处理后的数据: raw text - 执行命令:
输出同样为:python program.py -data 'raw text'处理后的数据: raw text
额外说明
- 自定义类型函数会被argparse自动调用,完成参数预处理
- 可根据业务需求调整文件读取逻辑,比如保留换行符、指定非UTF-8编码等
- 如果文件名包含空格或特殊字符,命令行中需给文件名加引号,例如
@"my test file.txt"
内容的提问来源于stack exchange,提问作者phoxd
相关产品推荐
相关产品推荐

