繁体   English   中英

使用Argparse在python中将xml转换为csv

[英]Using Argparse To Convert xml to csv in python

我需要接受一些命令行参数,例如:

argparse.py hi.xml --> to produce hi.csv or
argparse.py hi.xml -o hello.csv --> to produce hello.csv

这是我的代码:

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

def get_args(args):
    parser = argparse.ArgumentParser(description = "Converts CSV to XML")
    parser.add_argument('-v','--verbose',action='store_true',dest='verbose',help='Increases messages being printed to stdout')
    parser.add_argument("inputfile", help="Please input the name of the CSV file")
    parser.add_argument('-o','--outputfile',help='(optional) Output file name',nargs='?')
    args = parser.parse_args()
    ext = os.path.splitext(args.inputfile)[1].lower()
    if args.outputfile is None:
        if ext == ".csv":
            args.outputfile = os.path.splitext(args.inputfile)[0] + '.xml'

        elif ext == ".xml":
            args.outputfile = os.path.splitext(args.inputfile)[0] + '.csv'

    elif args.outputfile:
        if ext == ".csv":
            outputfile = open(args.outputfile, 'w')
        elif ext == ".xml":
            outputfile = open(args.outputfile,'w')
    else:
        sys.stderr.write('ERROR: Invalid extension %s\n' % ext)
        sys.exit(1)
    return args

def main(argv):
    args = get_args(argv[0:])
    if args is None:
        return 1
    ext = os.path.splitext(args.inputfile)[1].lower()
    if ext == ".csv":
        reader = read_csv(open(args.inputfile))
        generate_xml(reader, args.outputfile)

    if ext == ".xml":
        root = etree.parse(open(args.inputfile)).getroot()
        generate_csv(root, args.outputfile)


    if args.verbose:
        print ('Verbose Selected')
    if args.verbose:
        print ('Convert to XML with set name')

    return 0 

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')
    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
    head.set('total_holes', '%s'%i)
    indent.indent(root)
    tree.write(outfile)

def generate_csv(root, outfile):

    with open(outfile, 'w') as file_:

        writer = csv.writer(file_, delimiter="\t")

    for a in zip(root.findall("drillholes/hole/collar"),
                 root.findall("drillholes/hole/toe"),
                 root.findall("drillholes/hole/cost")):
        writer.writerow([x.text for x in a])

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

我只需要有关generate_csv部分的帮助。 从函数get_args(args)可以看到,我获取了参数,这也是我使用ext = ...更改文件扩展名的地方,然后使用return args将其返回。 主函数调用该函数并获取参数,然后再次检查扩展名,然后根据扩展名引出下一个函数。 在主要功能中,我已经解析了xml文件,因此我只将“ root”和“ args.outputfile”传递给generate_csv方法。 但是,这是发生错误的地方:xml.etree.ElementTree.parserError:找不到第1行第0列的元素。但是,我相信这可能不是唯一的错误,也许是我将参数传递到丢失或丢失的地方的方式。改性。 请帮忙

这并不是一个最小的例子,因此很难准确地弄清您的问题是什么,具体问题是什么。

该错误表明解析器没有输入。 这表明文件实际上是空的,或者文件指针已前进到文件末尾。 如果您不小心打开该文件进行写入并将其截断为零,则该文件可能为空。 如果您不小心打开文件指针进行读取,从文件中读取所有内容,而忽略了倒带文件指针,则文件指针可能会前进到文件末尾。

这样一来,您可以了解发生了什么,为什么不尝试一些需要一步步检查并打印出来的诊断程序呢? 也就是说,代替etree.parse(open(args.inputfile)) ,尝试类似的方法:

print( args.inputfile )
f = open( args.inputfile )
print( f.tell() )
print( f.read() )
f.seek(0)
xml = etree.parse( f )
print( xml )
root = xml.getroot()
print( root )

这样,您可以看到发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM