使用 Argparse 的 Python 错误

Posted

技术标签:

【中文标题】使用 Argparse 的 Python 错误【英文标题】:Python Error Using Argparse 【发布时间】:2013-06-06 10:44:45 【问题描述】:

我制作了一个使用 argparse 将 csv 文件转换为 xml 文件的程序。首先它将读取 csv 文件作为输入文件,然后将其转换为 xml 文件。这是我的代码:

import sys, argparse
import csv
import indent
from xml.etree.ElementTree import ElementTree, Element, SubElement, Comment, tostring

parser=argparse.ArgumentParser(description='Convert wordlist text files to various formats.', prog='Text Converter')
parser.add_argument('-v','--verbose',action='store_true',dest='verbose',help='Increases messages being printed to stdout')
parser.add_argument('-c','--csv',action='store_true',dest='readcsv',help='Reads CSV file and converts to XML file with same name')
parser.add_argument('-x','--xml',action='store_true',dest='toxml',help='Convert CSV to XML with different name')
parser.add_argument('-i','--inputfile',type=argparse.FileType('r'),dest='inputfile',help='Name of file to be imported',required=True)
parser.add_argument('-o','--outputfile',type=argparse.FileType('w'),dest='outputfile',help='Output file name')
args = parser.parse_args()

def main(argv):
    reader = read_csv(args.inputfile)
    if args.verbose: 
        print ('Verbose Selected')
    if args.toxml:
        if args.verbose:
            print ('Convert to XML Selected')
        generate_xml(reader, args.outputfile)
    if args.readcsv:
        if args.verbose:
            print ('Reading CSV file')
    if not (args.toxml or args.readcsv):
        parser.error('No action requested')
    return 1

def read_csv(inputfile):
      return list(csv.reader(inputfile))

def generate_xml(reader,outfile):
    root = Element('Solution')
    root.set('version','1.0')
    tree = ElementTree(root)

    head = SubElement(root, 'DrillHoles')
    head.set('total_holes', '238')

    description = SubElement(head,'description')
    current_group = None
    i = 0
    for row in reader:
        if i > 0:
            x1,y1,z1,x2,y2,z2,cost = row
            if current_group is None or i != current_group.text:
                current_group = SubElement(description, 'hole','hole_id':"%s"%i)

                collar = SubElement (current_group, 'collar','':', '.join((x1,y1,z1))),
                toe = SubElement (current_group, 'toe','':', '.join((x2,y2,z2)))                                       
                cost = SubElement(current_group, 'cost','':cost)
        i+=1    
    indent.indent(root)
    tree.write(outfile)

if (__name__ == "__main__"):
    sys.exit(main(sys.argv))

然后在我写的命令提示符下,Argparse.py -i 1250_12.csv -o output.xml -x 其中 argparse 是程序名称,1250_12.csv 是 csv 文件名,而 output.xml 是我想要的输出名称,-x 是将 csv 转换为 xml 的操作。 该程序在 10 分钟前运行,现在出现错误提示:

x1,y1,z1,x2,y2,z2,cost = row
Value error: need more than 1 value to unpack

【问题讨论】:

如果你打印row,你会发现它不是一个集合。 如果您使用版本控制工具,您可以看到自从它在十分钟前工作后发生了哪些变化。这样会更容易找到问题。 不相关,但通常返回代码 1 表示您的程序中发生了错误。您可能要考虑从main 返回0或者,不要返回任何东西,只需调用 main() 而不是 sys.exit(main(sys.argv))... 这会更 Pythonic(你不需要将 sys.argv 作为参数传递给 main,因为它已经是全球性的)。 你们知道吗,我是有史以来最大的白痴...... 【参考方案1】:

您的 CSV 中似乎有些行不完全是 7 列。也许有一些空行?

您可以使用try..except 来捕获和处理错误:

def generate_xml(reader,outfile):
    root = Element('Solution')
    root.set('version','1.0')
    tree = ElementTree(root)

    head = SubElement(root, 'DrillHoles')
    head.set('total_holes', '238')

    description = SubElement(head,'description')
    current_group = None
    next(reader) # skip the first line
    for row in reader:
        try:
            x1,y1,z1,x2,y2,z2,cost = row
        except ValueError as err:
            sys.stderr.write('e: r!r'.format(e=err, r=row))
        if current_group is None or i != current_group.text:
            current_group = SubElement(description, 'hole','hole_id':"%s"%i)
            collar = SubElement (current_group, 'collar','':', '.join((x1,y1,z1))),
            toe = SubElement (current_group, 'toe','':', '.join((x2,y2,z2))) 
            cost = SubElement(current_group, 'cost','':cost)
    indent.indent(root)
    tree.write(outfile)

此外,如果您设置reader = csv.reader(inputfile) 而不是将其设为列表,那么您的程序将需要更少的内存,因为reader 将是一个迭代器而不是行列表。

此外,要跳过带有next(reader) 的第一行,reader 必须是迭代器,而不是列表。因此,要使上述内容起作用,还要进行更改:

reader = read_csv(args.inputfile)

reader = csv.reader(inputfile)

【讨论】:

以上是关于使用 Argparse 的 Python 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Argparse 的 Python 错误

Python argparse 忽略无法识别的参数

Python3 覆盖 argparse 错误

Argparse 错误:python2.x 上的参数太少

Python Argparse“需要以下参数”错误

如何在同一个 python 脚本中使用 sys 和 argparse 而不会出现无法识别的参数错误?