Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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_Parsing_Command Line - Fatal编程技术网

Python 解析数字的命令行输入

Python 解析数字的命令行输入,python,parsing,command-line,Python,Parsing,Command Line,我正在编写一个命令行应用程序,希望用户能够将数字作为单个数字或范围输入。例如: $ myapp -n 3,4,5,6 或 我希望我的应用程序将这些内容放入Python列表中,例如[3,4,5,6] 我正在使用optpass,但不确定如何从这两种输入样式创建列表。一些示例代码会很好 编辑 我也希望能够输入多个范围: $ myapp -n 22-27, 51-64 如果字符串中有n-arg,则可以执行以下操作: def f(s): if '-' in s: i = s.i

我正在编写一个命令行应用程序,希望用户能够将数字作为单个数字或范围输入。例如:

$ myapp -n 3,4,5,6

我希望我的应用程序将这些内容放入Python列表中,例如[3,4,5,6] 我正在使用
optpass
,但不确定如何从这两种输入样式创建列表。一些示例代码会很好

编辑

我也希望能够输入多个范围:

$ myapp -n 22-27, 51-64

如果字符串中有n-arg,则可以执行以下操作:

def f(s):
    if '-' in s:
        i = s.index('-')
        return range(*map(int, s.split('-')))
    return map(int, s.split(','))
一些例子:

In [3]: s = '1, 2, 3, 4, 5, 6'

In [4]: f(s)
Out[4]: [1, 2, 3, 4, 5, 6]

In [5]: f('3-6')
Out[5]: [3, 4, 5]

In [6]: f('3-16-3')
Out[6]: [3, 6, 9, 12, 15]
使用。解析用户的输入,按“-”字符拆分,然后将这些参数传递给range

您的代码可能如下所示:

parameters = input.split('-')
completeRange = range(int(parameters[0]), int(parameters[1]))
如果他们输入单个数字,您可以很容易地将其解析为一个列表

import argparse

def parse_range(astr):
    result = set()
    for part in astr.split(','):
        x = part.split('-')
        result.update(range(int(x[0]), int(x[-1]) + 1))
    return sorted(result)

parser = argparse.ArgumentParser()
parser.add_argument('-n', type=parse_range)
args = parser.parse_args()
print(args.n)
屈服

% script.py -n 3-6
[3, 4, 5, 6]

% script.py -n 3,6
[3, 6]

% script.py -n 22-27,51-64 
[22, 23, 24, 25, 26, 27, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64]
你可以使用图书馆

例如:

from optparse import OptionParser

opt_parser = OptionParser(version="%prog 0.1")
opt_parser.usage = '%prog [options]\n\nTCP protocol reengineering tool'

# Options
opt_parser.add_option('-n', default="1,2,3")
(options, args) = opt_parser.parse_args()

list = []
for s in options.n.split(","):
    list.append(int(s))

在保存输入之前,您可以定义参数并使用来处理输入:

from optparse import OptionParser

parser = OptionParser()

def create_range_callback(option, opt, value, parser):
    i, j = map(int, value.split('-'))
    setattr(parser.values, option.dest, range(i, j+1))

parser.add_option("-r", "--range", action="callback", 
                  callback=create_range_callback, 
                  type="string", dest='list')

(options, args) = parser.parse_args()

print options.list
现在做:

python2.7 test.py -r 1-5
输出:

[1, 2, 3, 4, 5]

相关:我喜欢这个解决方案。我希望看到一些输入验证,这真的是:)如果输入列表是巨大的,这将是相当次优的,但我怀疑它不是。这也不包括上限。这将不包括上限,如所需。还有一件事我希望能够输入多个范围,例如myapp 22-27, 51-64@normski:对。只要在
22-27、
51-64
之间不加空格,上述代码就可以处理它。(这样整个字符串将加载到
opt.n
[1, 2, 3, 4, 5]