我是python的新手,我目前正试图弄清楚如何使用argparse
打开多个文件。从过去在这里发布的问题来看,似乎大多数人都要求只打开一个文件,我用它作为我的示例代码的基础。我的示例代码是:
import sys
import argparse
parser = argparse.ArgumentParser(description="Compare two lists.")
parser.add_argument('infile1', type = file)
parser.add_argument('infile2', type = file)
parser.add_argument('--same', help = 'Find those in List1 that are the same in List2')
parser.add_argument('--diff', help = 'Find those in List2 that do not exist in List2')
parser.parse_args()
data1 = set(l.rstrip() for l in open(infile1))
data2 = set(l2.rstrip() for l2 in open(infile2))
在两个文本文件中使用argparse
的正确方法是什么? ' -h'按预期工作,但我收到错误error: argument --same: expected one argument
。
P.S。最后我将用/ open
替换两个set命令答案 0 :(得分:3)
1)您定义--same
和--diff
的方式需要一个参数来跟随它们,这些参数将被分配给已解析的参数名称空间。要改为使用布尔标志,可以通过指定关键字参数action='store_true'
来更改action:
parser.add_argument('--same',
help='Find those in List1 that are the same in List2',
action='store_true')
2)您不会将已解析的参数存储在变量中,并且您尝试将它们称为本地而不是{{1}返回的对象}:
parse_args()
3)如果为参数指定type=file
,则解析的参数实际上已经是一个打开的文件对象 - 所以不要在其上使用args = parser.parse_args()
if args.same:
# ...
:
open()
注意:目前,用户可以合法地同时指定data1 = set(l.rstrip() for l in args.infile1)
和--same
,因此您的计划需要处理该问题。您可能想要制作这些标志mutually exclusive。
答案 1 :(得分:2)
因为默认add_argument()
是针对带参数的参数(try --help
),但您必须设置action=store_true
。
parser.add_argument('--same', help = 'Find those in List1 that are the same in List2', action='store_true')
这是你的--help
:
>>> parser.parse_args(['--help'])
usage: [-h] [--same SAME] [--diff DIFF] infile1 infile2
Compare two lists.
positional arguments:
infile1
infile2
optional arguments:
-h, --help show this help message and exit
--same SAME Find those in List1 that are the same in List2
--diff DIFF Find those in List2 that do not exist in List2
一旦你的参数被解析,你就可以作为args的成员访问它们了:
data1 = set(l.rstrip() for l in open(args.infile1))
data2 = set(l2.rstrip() for l2 in open(args.infile2))