Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 如何使用argparse让用户更改现有程序的输出?_Python_Arrays_Command Line Interface_Command Line Arguments_Argparse - Fatal编程技术网

Python 如何使用argparse让用户更改现有程序的输出?

Python 如何使用argparse让用户更改现有程序的输出?,python,arrays,command-line-interface,command-line-arguments,argparse,Python,Arrays,Command Line Interface,Command Line Arguments,Argparse,我有一个程序,可以生成一组数据,并很好地打印出来。我寻求解决方案的挑战如下: 在打印阵列中的数据之前,请将其弄脏,例如,粘住 非UTF-8字符,字段顺序错误, 更改日期格式 让用户选择发生的“垃圾” 这是我现有程序的精简版本,可以运行,我希望截取并破坏它的输出: ex_matrix = [[402, 'Mayonnaise', '0123', 2014-12-18, '(Burlington, -, -)', 1.0], [413, 'Peanuts', '0177

我有一个程序,可以生成一组数据,并很好地打印出来。我寻求解决方案的挑战如下:

  • 在打印阵列中的数据之前,请将其弄脏,例如,粘住 非UTF-8字符,字段顺序错误, 更改日期格式
  • 让用户选择发生的“垃圾”
这是我现有程序的精简版本,可以运行,我希望截取并破坏它的输出:

ex_matrix = [[402, 'Mayonnaise', '0123', 2014-12-18, '(Burlington, -, -)', 1.0],
             [413, 'Peanuts', '0177', 2014-11-10, '(Place, Florida, South Afrika)', 1.0],
             [415, 'Seaweed', '0713', 2014-12-02, '(The Pub, -, Newfoundland)', 1.0]]

def print_forecasts(matrix, num_rows):
    for r in xrange(num_rows):
        print("{%s, [%s, %s, %s, %s], %s}" % (matrix[r][0], matrix[r][1],
              matrix[r][2], matrix[r][3], matrix[r][4], matrix[r][5]))
        print "# Generated using pickles_program.py \n"

def main():
    print_forecasts(ex_matrix, 3)

main()
从我读到的Python、和几个StackOverflow的答案来看,argparse似乎是解决这个问题的关键。以下是我所写的,只是想了解argparse的工作原理:

import argparse

num_rows = 3

parser = argparse.ArgumentParser(description="base rate model: error adder")

parser.add_argument("muck2", help="muck up the population field", nargs='?')
args = parser.parse_args()
for i in xrange(num_rows):
    matrix[i][1] = "^&*#$)(*DJJJJ)"
    print matrix
将有超过10种类型的垃圾供用户选择。我想我希望用户能够对命令行说,“python pickles_program.py 13 8 11”或类似的话,并让混乱的1、3、8和11发生,让“python pickles_program.py--help”显示所有混乱选项

如果这是个愚蠢的问题,我希望你能原谅我。我是一个Python新手,仍然在学习如何使用大量资源来学习这门伟大的语言,但我已经搜索了很多Python文档——请相信我,如果有我的问题的答案,要么对像我这样的人解释得不够好,要么太难找到,因为我还没找到


请特别就如何更好/更清楚地提出问题提出建议

在我看来,把你的“垃圾”当作旗子而不是数字来处理会容易得多。然后,您可以使用ArgParse检查这些标志是否已启用。例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
   print "verbosity turned on"

通过这种方式,通过解析器添加所有的“muck up”。添加参数(“argument”,action=“store\u true”),然后在一系列if语句下为每个“muck up”进行逻辑运算。

为了便于学习,最好在没有任何额外模块的情况下开始。直接从
sys.argv
工作即可。比如说

import sys
muck_ups = []
if sys.argv[1:]:  # values beyond the program name
    muck_ups = [int(i) for i in sys.argv[1:]]
    # this will throw an error if one of the strings can't be converted to an int
    # we can refine that later

if len(muck_ups)==0:
    print('help...')
    sys.exit(1)
    # print help if they don't give you any numbers

for m in muck_ups:
    if m in [1]:
       pass # do one muckup
    elif m in [2]:
       <do another>
    elif m in [3]:
       <etc>
    else:
        print('muckup %s not found'%m)
如果要按照
muck\u ups
值指示的顺序执行操作,请使用类似这样的逻辑。如果要执行
action1
if
1 in muck\u ups
,则需要使用不同的逻辑,然后执行
action2
if 2 in muck\u ups:,等等

一个简单的
argparse
解析器,具有:

parser.add_argument('muck_ups', type=int, nargs='*')
将在
args.muck\u ups
中给出相同的整数列表。如果您想添加更多开关和选项,
argparse
将非常有用,但对于这样的一个参数来说,这并没有多大区别


argparse
(和相关模块)主要是解析输入的一种方式;弄清楚用户想要做什么。这不是一种执行机制。不要因为让它做一些花哨的事情而感到不安。

你能把它简化成一个MWE(最小工作示例)吗?@TobiaTesan我很想做任何事情使这个问题尽可能符合我的要求,但我不知道“最小工作示例”是什么意思。请澄清?谢谢你的理解。这里:这可能是相关的(关于)如果你必须使用数字,请回复,我会想出一个解决方案。不,无论如何——我不喜欢使用数字!事实上,旗帜是我想问的一个概念。我看到他们谈论了很多,但还没有弄清楚他们是什么。你能解释一下吗,或者让我找个地方解释一下吗?标志是参数,除非你可以把它们放在任何位置。例如:nmap-ss127.0.0.1-p0和nmap-p0-ss127.0.0.1产生相同的结果。它们允许您在变量存在或不存在时“TRUE”或“NULL”变量,并为标志赋值。例如,在上面的nmap示例中,-p=0。
parser.add_argument('muck_ups', type=int, nargs='*')