【问题标题】:Parser in python3 does not take delimiter values from commandline via argparsepython3中的解析器不通过argparse从命令行获取分隔符值
【发布时间】:2012-09-02 07:58:49
【问题描述】:

我编写了一个简单的脚本作为我的awk/sed 要求的高级工具。在脚本中,我根据查询文件的一列中的值比较两个文件,然后从主文件中提取整个条目。该脚本允许您为每个文件输入列值和分隔符。

问题是从命令行给出的“分隔符”选项无法被脚本识别。

这是我的代码(部分):

##- - - - - - - -- - - - - - Arguments - - - - - - - - - - - - - -##
parser = argparse.ArgumentParser()

## Command line options
parser.add_argument("-m",  "--master",     dest="master", help="master file")
parser.add_argument("-q",  "--query",      dest="query",  help="queries to be extracted")
parser.add_argument("-d",  "--delimiter",  dest="delimiter",  default='\t', help="delimiter in master")
parser.add_argument("-p",  "--position",   dest="position",   default='1',  help="position/column of value in master")
parser.add_argument("-d2", "--delimiter2", dest="delimiter2", default='\t', help="delimiter in query")
parser.add_argument("-p2", "--position2",  dest="position2",  default='1',  help="position/column of value in query")

args = parser.parse_args()

def Extractor(master, query):

    out_file = ('%s_matched_%s' % (query,master))
    fh_out = open(out_file, 'w')

    query_set = () ## To unique query set
    for i in query:
        key = i.split('args.delimiter2')[int(args.position2)] ## Key is the value on which matching will be done
        query_set.add(key)

如您所见,我从命令行选择“查询文件”分隔符,并通过argparse 在脚本中使用它们,但这不起作用。仅当我在脚本中明确提及分隔符时才有效,例如:

key = i.split('\t')[args.position2] ## Key is the value on which matching will be done

我给出的命令行选项是:

$ py3 ExtractHeaders_v01.py -m ABC.csv -q XYZ.list -d2 \t -d , -p 1 -p2 0

在哪里

  • ABC.csv 是从中提取条目的主文件。
    • 第二列将用于匹配 (-p 1)
    • 它的分隔符是逗号 (-d ,)
  • XYZ.list 是查询文件。
    • 第一列将用于匹配 (-p2 0)
    • 它的分隔符是制表符(-d2 \t

请帮助我理解为什么从命令行给出分隔符时脚本不使用分隔符。

【问题讨论】:

    标签: python command-line-arguments delimiter argparse


    【解决方案1】:

    您也可以在*nix shell(例如bash)中传递Tab 字符,方法是按Ctrl+V,然后按Tab 括在引号(单引号或双引号)中,即键入" Ctrl+V @ 987654326@".

    【讨论】:

    • 您也可以使用带引号的字符串$'\t',无论readline 是否处于活动状态,它都适用于bash
    • 更好的选择。很高兴知道!
    【解决方案2】:

    您的 shell 正在解释命令行中的 \t,而传递给 Python 的很可能是单个 t。尝试\\t'\t' 将文字两字符转义序列放入argv。然后你需要在 Python 中取消转义这个字符串:

    delimiter = delimiter.decode("string-escape") 
    

    【讨论】:

    • 这似乎是确切的解决方案,但您能告诉我在上面的脚本中我应该将“delimiter = delimiter.decode("string-escape")”放在哪里吗?
    • 这是我尝试过的:args.delimiter = args.delimiter.decode("''") args.delimiter2 = args.delimiter2.decode("''")...但出现错误: args.delimiter = args.delimiter.decode("''") NameError: name 'args' is not defined
    猜你喜欢
    • 2016-12-20
    • 2020-09-06
    • 2019-10-17
    • 2021-01-12
    • 1970-01-01
    • 2013-09-13
    • 2017-09-27
    • 2012-09-05
    相关资源
    最近更新 更多