我正在编写一个Python脚本来处理一个机器可读的文件,并输出一个包含在其中的数据的人类可读报告。
我想提供将数据输出到stdout (-s)
(默认情况下)或txt (-t)
或csv (-c)
文件的选项。我想像许多命令那样切换默认行为。
就Usage:
而言,我希望看到script [-s | -c | -t] input file
之类的内容,如果没有传递参数,则-s
为默认值。
我目前有(对于相关的args,简而言之):
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_true')
group.add_argument('-c', '--csv', action='store_true')
group.add_argument('-t', '--txt', action='store_true')
args = parser.parse_args()
if not any((args.stdout, args.csv, args.txt)):
args.stdout = True
因此,如果未设置-s
,-t
或-c
,stdout (-s)
将被强制为True,就像传递了-s
一样。
有没有更好的方法来实现这一目标?或者通常会考虑采用另一种方法,以及更好的方法。出于某种原因?
注意:我使用的是Python 3.5.1 / 2,并且我并不担心与其他版本的兼容性,因为目前还没有计划与其他人共享此脚本。只是为了让我的生活更轻松。
答案 0 :(得分:22)
您可以让每个操作更新同一个变量,并将stdout作为该变量的默认值。
考虑这个程序:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument(
'-s', '--stdout', action='store_const', dest='type', const='s', default='s')
group.add_argument(
'-c', '--csv', action='store_const', dest='type', const='c')
group.add_argument(
'-t', '--txt', action='store_const', dest='type', const='t')
args = parser.parse_args()
print args
您的代码可能如下所示:
if args.type == 's':
ofile = sys.stdout
elif args.type == 'c':
ofile = ...
...
您可以使用.add_argument()
指定默认类型,而不是随意选择其中一个parser.set_defaults()
来指定默认类型。
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_const', dest='type', const='s')
group.add_argument('-c', '--csv', action='store_const', dest='type', const='c')
group.add_argument('-t', '--txt', action='store_const', dest='type', const='t')
parser.set_defaults(type='s')
args = parser.parse_args()
print args
不是将类型指定为枚举值,而是可以将callable存储到类型中,然后调用callable:
import argparse
def do_stdout():
# do everything that is required to support stdout
print("stdout!")
return
def do_csv():
# do everything that is required to support CSV file
print("csv!")
return
def do_text():
# do everything that is required to support TXT file
print("text!")
return
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout', action='store_const', dest='type', const=do_stdout)
group.add_argument('-c', '--csv', action='store_const', dest='type', const=do_csv)
group.add_argument('-t', '--txt', action='store_const', dest='type', const=do_text)
parser.set_defaults(type=do_stdout)
args = parser.parse_args()
print args
args.type()
答案 1 :(得分:0)
您可以使用sys.argv“作弊”:
import sys
def main():
if len(sys.argv) == 2 and sys.argv[1] not in ['-s', '-c', '-t', '-h']:
filename = sys.argv[1]
print "mode : stdout", filename
else:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--stdout')
group.add_argument('-c', '--csv')
group.add_argument('-t', '--txt')
args = parser.parse_args()
if args.stdout:
print "mode stdout :", args.stdout
if args.csv:
print "mode csv :", args.csv
if args.txt:
print "mode txt :", args.txt
if __name__ == "__main__":
main()