Python 使用argparse模块解析命令行读取参数简介

在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。万能的python就自带了argprase包使得这一工作变得简单而规范。PS:optparse包是类似的功能,只不过写起来更麻烦一些。

如果脚本很简单或临时使用,没有多个复杂的参数选项,可以直接利用sys.argv将脚本后的参数依次读取(读进来的默认是字符串格式)。比如如下名为test.py的脚本:

import sys
print "Input argument is %s" %(sys.argv[0])

在shell脚本中运行python test.py help可以得到Input argument is help的结果。
1) 一般形式
但是大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的。
同样用名为test.py的脚本举个栗子:

import argparse

parser = argparse.ArgumentParser(description="your script description")            # description参数可以用于插入描述脚本用途的信息,可以为空
parser.add_argument('--verbose', '-v', action='store_true', help='verbose mode')   # 添加--verbose标签,标签别名可以为-v,这里action的意思是当读取的参数中出现--verbose/-v的时候
                                                                                   # 参数字典的verbose建对应的值为True,而help参数用于描述--verbose参数的用途或意义。
args = parser.parse_args()                                                         # 将变量以标签-值的字典形式存入args字典
if args.verbose:
    print "Verbose mode on!"
else:
    print "Verbose mode off!"

运行python test.py后面跟了--verbose/-v的时候会输出前者,如果什么都没有会输出后者。如果输入了--verbose/-v以外的参数则会报错:unrecognized arguments
稍微提一下,action参数表示值赋予键的方式,这里用到的是bool类型;如果是'count'表示将--verbose标签出现的次数作为verbose的值;'append'表示将每次出现的该便签后的值都存入同一个数组再赋值。(嘛,一般后面两种用的比较少就不多说了)
PS:--help标签在使用argparse模块时会自动创建,因此一般情况不需要我们主动定义帮助信息。

$ python test.py --help
usage: test.py [-h] [--verbose]

your script description

optional arguments:
    -h, --help        show this help message and exit
    --verbose, -v     verbose mode  

2) 必需参数
这种模式用于确保某些必需的参数有输入。
parser.add_argument('--verbose', required=True, type=int)
required标签就是说--verbose参数是必需的,并且类型为int,输入别的类型会报错。

3)位置参数(positional arguments)
位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同。

parser.add_argument('filename')    # 输入的第一个参数赋予名为filename的键
args = parser.parse_args()
print "Read in %s" %(args.filename)

输入python test.py test.txt则会输出Read in test.txt
此外,可以用nargs参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。
parser.add_argument('num', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+’表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。)比如用:

parser.add_argument('filename')
parser.add_argument('num', nargs='*)

就可以运行python test.py text.txt 1 2
由于没有标签,所以用位置参数的时候需要比较小心。

4)输入类型
之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。

parser.add_argument('file', type=argparser.FileType('r'))    # 读取文件
args = parser.parse_args()
for line in args.file:
    print line.strip()

5)参数默认值
一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。

parser.add_argument('filename', default='text.txt')

这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了。

6)候选参数选择
表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:

parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])

相关命令再解释:

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

解释:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用,下面简单说明一下步骤2和3。

 

方法ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents [],formatter_class=argparse.HelpFormatter, prefix_chars='-',fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True)

这些参数都有默认值,当调用parser.print_help()或者运行程序时由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数,如上。


方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

其中:

name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None

nargs:命令行参数的个数,一般使用通配符表示,其中,'?'表示只用一个,'*'表示0到多个,'+'表示至少一个

default:默认值

type:参数的类型,默认是字符串string类型,还有float、int等类型

help:和ArgumentParser方法中的参数作用相似,出现的场合也一致


参考:https://mkaz.tech/python-argparse-cookbook.html
https://docs.python.org/2/howto/argparse.html

来源: https://www.cnblogs.com/arkenstone/p/6250782.html

欢迎关注公众号学习自然语言处理技术


好的,这是一个使用 argparse 和 chardet 模块Python 程序,可以将指定编码格式的文件转存成 UTF-8 格式: ```python import argparse import chardet def convert_to_utf8(input_file, input_encoding=None): # 检测输入文件的编码格式 if input_encoding is None: with open(input_file, 'rb') as f: raw_data = f.read() input_encoding = chardet.detect(raw_data)['encoding'] # 读取输入文件并转换为 UTF-8 格式 with open(input_file, 'r', encoding=input_encoding) as f: data = f.read() output_file = input_file + '_utf8' with open(output_file, 'w', encoding='utf-8') as outfile: outfile.write(data) print('文件已成功转存为 UTF-8 格式,输出文件名为', output_file) if __name__ == '__main__': parser = argparse.ArgumentParser(description='将输入文件转存为 UTF-8 格式') parser.add_argument('input_file', help='输入文件名') parser.add_argument('-e', '--encoding', help='输入文件的编码格式') args = parser.parse_args() convert_to_utf8(args.input_file, args.encoding) ``` 首先,我们导入了 argparse 和 chardet 模块。其中 argparse 模块用于解析命令行参数,chardet 模块用于检测文件的编码格式。 然后,我们定义了一个 `convert_to_utf8` 函数,用于将指定编码格式的文件转存成 UTF-8 格式。该函数接受两个参数:输入文件名和输入文件的编码格式。如果用户没有指定输入文件的编码格式,则使用 chardet 模块“猜”出其编码格式,用于解码。 接着,我们使用 argparse 模块解析用户的命令行输入。其中,`parser.add_argument` 方法用于定义命令行参数,`parser.parse_args` 方法用于解析命令行参数并返回一个 Namespace 对象,其中包含了用户输入的参数和选项。 最后,我们调用 `convert_to_utf8` 函数,并传入用户输入的文件名和编码格式。如果用户没有指定编码格式,则 chardet 模块将检测文件的编码格式,并用于解码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值