如何用argparse或类似工具处理每行作为命令的文件?
解析程序内CLI风格字符串的方案
用argparse实现(完全可行)
argparse根本不限制参数必须来自命令行的sys.argv,它的parse_args()方法接受任意字符串列表作为输入。结合shlex.split()处理带引号的参数(比如"hello world"不会被拆成两个元素),就能完美解析你从文本文件读取的每行命令。
示例代码
import argparse import shlex # 定义参数解析规则 parser = argparse.ArgumentParser() parser.add_argument("file_path", help="目标文件的路径") parser.add_argument("-r", action="store_true", help="读取文件内容到指定对象") parser.add_argument("-w", help="将指定字符串追加到文件") # 模拟从文本文件读取的一行命令 command_line = '~/test2.txt -w "hello world"' # 拆分字符串为符合CLI格式的参数列表 args_list = shlex.split(command_line) # 解析参数 args = parser.parse_args(args_list) # 根据参数执行对应操作 if args.r: with open(args.file_path, 'r') as f: file_content = f.read() # 把content保存到你的目标对象 elif args.w: with open(args.file_path, 'a') as f: f.write(args.w + '\n')
替代方案(无需自行编码)
如果不想用argparse,还可以用这些成熟的第三方CLI框架:
1. Click库
Click是功能更丰富的CLI开发框架,同样支持解析自定义参数列表:
import click import shlex @click.command() @click.argument('file_path') @click.option('-r', is_flag=True, help='读取文件内容') @click.option('-w', help='追加内容到文件') def process_file(file_path, r, w): if r: with open(file_path, 'r') as f: content = f.read() # 处理读取的内容 if w: with open(file_path, 'a') as f: f.write(w + '\n') # 解析目标字符串 command_line = '~/test1.txt -r' args_list = shlex.split(command_line) # 执行命令,standalone_mode=False避免Click直接退出程序 process_file.main(args_list, standalone_mode=False)
2. Docopt库
Docopt通过文档字符串定义参数规则,语法简洁,支持传入自定义参数列表:
from docopt import docopt import shlex # 定义参数规则的文档字符串 doc_string = """ Usage: file_handler <file_path> [-r] [-w <text>] Options: -r 读取文件内容 -w <text> 将指定文本追加到文件 """ # 解析目标字符串 command_line = '~/test2.txt -w "hello there"' args_list = shlex.split(command_line) args = docopt(doc_string, argv=args_list) # 执行对应操作 if args['-r']: with open(args['<file_path>'], 'r') as f: content = f.read() if args['-w']: with open(args['<file_path>'], 'a') as f: f.write(args['-w'] + '\n')
内容的提问来源于stack exchange,提问作者Blokz101
相关产品推荐
相关产品推荐

