使用argparse进行文件名输入

4

大家好,我正在尝试在命令行使用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文件时,会出现以下错误:

File "snp_freq_V1-0_export.py", line 33, in load_search_snps with open(input_file, 'r+') as varin: TypeError: invalid file: ['snpstocheck.csv']

如果我从脚本内部提供文件路径,则可以正常工作。据我所知,我得到了与文件名字符串匹配的snp_database_location 字符串,但是之后我得到了错误。我错过了什么导致类型错误?


你在错误信息中缺少 []。列表和字符串之间的区别很重要。 - hpaulj
1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接