2013-06-18 55 views
0

我想將給定csv文件的文件擴展名更改爲xml擴展名,反之亦然。在命令行,我可以輸入以下在python中使用argparse更改文件擴展名

Boo a.csv.     giving a.xml 
Boo a.xml.     giving a.csv 
Boo a.csv -out shoes.xml  giving shoes.xml 

這裏是我更新的代碼:

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

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' 
    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 
    reader = read_csv(args.inputfile) 
    if args.verbose: 
     print ('Verbose Selected') 
    if args.verbose: 
     print ('Convert to XML with set name') 
    generate_xml(reader, args.outputfile) 
    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) 

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

現在我在X1得到一個錯誤,Y1,Z1,X2,Y2,Z2,成本=行,這是一個值錯誤,說:需要多個值來解壓

+1

什麼是* tree *變量? – sergzach

+0

它的糟糕的形式來說'== None'使用'是None'或更好,如果不是'args.outputfile:' – cmd

+1

使用一個python調試器,比如idle,eric或者komodo。只需幾分鐘即可完成代碼,答案將很清楚! – tdelaney

回答

0

問題是,你沒有分配擴展名爲分機。該擴展是由splitext返回的第二個項目。當ext既不是.xml或.csv時,您也應該有其他條件。這個錯誤路徑會告訴你這個問題。

編輯:您的代碼有其他問題,所以我添加了一些評論標記爲待辦事項。您不應該將參數分析與程序的實現混合在一起。所以,你在調用tree.whatever()的地方應該在清理完你的參數後完成。你會發現你只需要在最後調用tree.whatever()一次。

import argparse 
import os 
import sys 
import csv 
from xml.etree.ElementTree import ElementTree, Element, SubElement 

parser = argparse.ArgumentParser(description = "Converts CSV to XML") 
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' 
     tree.write(args.outputfile) # TODO: There is no 'tree' defined 
    elif ext == ".xml": 
     args.outputfile = os.path.splitext(args.inputfile)[0] + '.csv' 
     tree.write(args.outputfile) # TODO: There is no 'tree' defined 
    else: 
     sys.stderr.write('ERROR: Invalid extension %s\n' % ext) 
     sys.exit(1) 

# TODO: This should be removed completely 
if args.outputfile: 
    args.outputfile = os.path.splitext(args.outputfile)[1] #handles the condition if there is an outputfile set by the user 
# TODO: create tree and do the work here 
+0

好的謝謝,我已經把樹插入到這個我可以告訴你我更新的代碼? – Andy

+0

@安迪,你可以用新的代碼更新你的文章。就我個人而言,如果您將其放在當前帖子的底部並註明您已更改它,我覺得它不那麼令人困惑。 – tdelaney

+0

好的,謝謝我更新了代碼 – Andy