使用argparse进行文件名输入

时间:2014-02-05 14:23:40

标签: python bash python-3.x argparse

您好我正在尝试使用argparse从命令行输入文件名,但我很难让它运行起来。

我想从命令行(-d)传递一个字符串,该字符串对应于文件名(datbase.csv)并将其存储在变量inputargs.snp_database_location中。

这被作为我的load_search_snaps函数的输入,如下面的代码所示,它打开文件并对其进行填充(伪代码)。

    import csv, sys, argparse

    parser = argparse.ArgumentParser(description='Search a list of variants against the in house database')
    parser.add_argument('-d', '--database',
        action='store',
        dest='snp_database_location',
        type=str,
        nargs=1,
        help='File location for the in house variant database',
        default='Error: Database location must be specified')

    inputargs = parser.parse_args()

    def load_search_snps(input_file):
        with open(input_file, 'r+') as varin:
            id_store_dictgroup = csv.DictReader(varin)
            #do things with id_store_dictgroup                                                                          
        return result

    load_search_snps(inputargs.snp_database_location)

使用bash中的命令:

  

python3 snp_freq_V1-0_export.py -d snpstocheck.csv

当我尝试使用命令行从同一目录传递一个常规csv文件时出现以下错误:

  

文件“snp_freq_V1-0_export.py”,第33行,在load_search_snps中       with open(input_file,'r +')as varin:TypeError:invalid file:['snpstocheck.csv']

如果我从脚本中提供文件路径,它可以完美地工作。据我所知,我得到一个与文件名字符串匹配的snp_database_location字符串,但后来我得到了错误。我错过了什么给出了类型错误?

1 个答案:

答案 0 :(得分:5)

nargs=1使inputargs.snp_database_location成为一个列表(包含一个元素),而不是字符串。

In [49]: import argparse

In [50]: parser = argparse.ArgumentParser()

In [51]: parser.add_argument('-d', nargs=1)
Out[51]: _StoreAction(option_strings=['-d'], dest='d', nargs=1, const=None, default=None, type=None, choices=None, help=None, metavar=None)

In [52]: args = parser.parse_args(['-d', 'snpstocheck.csv'])

In [53]: args.d
Out[53]: ['snpstocheck.csv']

要修复此问题,请删除nargs=1