Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用状态解析命令行_Python_Command Line_State_Argparse - Fatal编程技术网

在Python中使用状态解析命令行

在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。此外,它将开始以默认

某些程序命令行的状态应用于状态设置选项后面的参数(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。此外,它将开始以默认的“%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"]])