在Python中使用状态解析命令行
某些程序命令行的状态应用于状态设置选项后面的参数(rm和touch的“---”参数就是一个例子;ffmpeg因有状态arg解析而臭名昭著)。例如:在Python中使用状态解析命令行,python,command-line,state,argparse,Python,Command Line,State,Argparse,某些程序命令行的状态应用于状态设置选项后面的参数(rm和touch的“---”参数就是一个例子;ffmpeg因有状态arg解析而臭名昭著)。例如: readmulticsv--cols 1,2,4 file1.csv--date_格式“%Y-%m-%d”file2.csv--cols 4,3,9 file3.csv file4.csv 在这里,它将从file1.csv和file2.csv中提取列1、2和4,然后按顺序从file3.csv和file4.csv中提取列4、3和9。此外,它将开始以默认
readmulticsv--cols 1,2,4 file1.csv--date_格式“%Y-%m-%d”file2.csv--cols 4,3,9 file3.csv file4.csv
在这里,它将从file1.csv和file2.csv中提取列1、2和4,然后按顺序从file3.csv和file4.csv中提取列4、3和9。此外,它将开始以默认的“%m/%d/%Y”格式解释file1.csv中的日期(在--cols参数的第一列中),但其余文件将切换到“%Y-%m-%d”。我想要的是一个列表列表,其中每个元素列表都有文件名和相关状态变量的值:
[["file1.csv", "1,2,4", "%m/%d/%Y"],
["file2.csv", "1,2,4", "%Y-%m-%d"],
...
]
如果手动遍历sys.argv,那么实现这一点很简单
有没有办法用argparse实现这一点?我的程序将argparse用于许多其他选项和它的帮助特性,整个代码都是围绕其名称空间对象编写的。我可以使用parse_known_args()并将其余部分留给“walk”方法,但这不包括--cols、-date_格式以及帮助和命名空间中的文件。我已经试着找出一个动作(),但我不确定如何继续。用于设置的文档对我来说不是非常清楚,我不知道如何访问现有状态
是否有替代的arg解析器可以完成这一切(帮助、默认值、名称空间)
我的应用程序是一个通过读取CSV交易文件来计算股票基础、收益和增长的程序,在这些文件中,投资在几十年来以不同的文件格式和格式变化在经纪人之间转移。我可以为每种旧格式编写一个转换器,但我更愿意编写一个直接从源数据工作的程序
谢谢
--jh--与早期的
optpasse
和getopt
相比,argparse
增加的一个重要功能是处理位置的能力。它使用类似于re
的语法和模式匹配将字符串(从sys.argv
列表)分配给位置参数和选项(标记的)参数
基本解析例程是交替解析位置
和可选
与:
我可以想象定义一个
parser.add_argument('--cols', nargs='+', action='append')
parser.add_argument('--date_format', nargs='+', action='append')
导致
args.cols = [['1,2,4','file1.csv'], ['4,3,9', 'file3.csv', 'file4.csv']]
args.date_format = [["%Y-%m-%d", 'file2.csv']]
argparse
不保留有关如何交错cols
和date
选项的信息
我很想收集位置中的“文件”名,但是没有一种方法可以在每个可选位置之间排序连续的位置
在最近的一次访问中,我建议使用列表预填充args
,例如
argparse.Namespace(cols=[[]], date_format=[["%m/%d/%Y"]])
并更改cols
操作以替换最后一个空列表。新的date\u格式
将更新cols
和date\u格式
以启动新的“状态”
在默认的操作
子类中,调用
将新值写入属性(使用setattr
),覆盖默认值或以前写入的内容append
子类,获取属性(getattr
),将其追加并写回。默认类只使用它们自己的dest
操作
可以访问的唯一“状态”是命名空间
。但是,如果您设计自定义操作子类来获取和保存适当的属性,这可能就足够了。自定义操作甚至可以写入和读取add\u参数调用中未指定的属性。(在文档中,set_defaults
用于为子parser添加函数属性。)
另一种定制方法是定义一个新的命名空间
类。默认的方法很简单,只显示了一种方法。在可能的情况下,argparse
使用getattr
、hasattr
和setattr
与命名空间交互,因此它对该类施加最小的约束
因此,在类型
函数、动作
子类、名称空间
类和格式化程序
之间有很大的空间可供定制argparse
。但是您确实需要研究argparse.py
代码。并认识到,要改变基本的解析顺序,您几乎无能为力
处理>代码> sys .ARGV < /代码>是另一种工具,如后处理<代码> ARGs< /Cord>命名空间。< /P>这听起来像是一次性项目,所以如果没有人提供解决方案,请考虑将其加载到关系数据库中,并依赖它来对数据进行NoMurMax。只是个主意。祝你好运每个标记的选项(例如--cols)都是独立处理的。“append”
action
类可用于将来自单独“col”的输入收集到一个列表中。这些可以是字符串,也可以是列表,具体取决于nargs
。如果您想编写自己的Action
子类,请查看现有子类是如何定义的。例如,“append”确实从名称空间获取现有值。多年来,我和其他人都建议使用Action
子类。请记住,您已经向用户(或您自己)解释了这一点。该程序是一次性的,但有状态命令行的问题并非如此。很多程序都有它们,但经过几天的搜索,我还没有看到一个Python解析的例子。追加操作不会记录其他选项的状态。困难在于在附加文件时将最新的--cols和--date_格式与每个文件相关联。解释起来很简单:最新的--cols和--date_格式适用于遇到的每个文件。从左到右读取命令行时,这些设置在更改之前保持有效
argparse.Namespace(cols=[[]], date_format=[["%m/%d/%Y"]])