使用argparse打开两个文件

时间:2014-05-05 19:20:27

标签: python argparse

我是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命令

2 个答案:

答案 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))