2013-06-23 3 views
2

여기에 내 업데이트 된 코드가 있으며 대부분은 generate_csv 부분에서 하나만 제외하고 작동합니다. 모든 generate_xml 부분을 무시할 수 있습니다. 폐쇄 된 파일에 대한 I/O 작업 :XML을 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)) 

여기 내 새로운 코드 만 writer.writerow에서 ([A에서 x의 x.text])라는 오류가 발생합니다. 어떻게 수정합니까

답변

2
import csv 
import sys 
import xml.etree.ElementTree as etree 

if __name__ == "__main__": 

    file_name = sys.argv[1] 
    csv_file_name = '.'.join(file_name.split('.')[:-1]) + ".csv" 

    root = etree.parse(file_name).getroot() 

    with open(csv_file_name, '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]) 
+0

감사합니다. 명령 행에서 매개 변수를 지정하려면 다음을 입력하십시오 : argparse.py test.xml, 명령 행에서 test.csv를 입력하면됩니다. – Andy

+0

그러면 sys를 가져 와서'sys.argv [1]','sys.argv [2]'등을 통해 파싱 할 파일의 이름을 추출 할 수 있습니다. 단지'open (...)'호출에서 문자열 리터럴을 적절한 변수로 대체하십시오. http://docs.python.org/2/library/sys.html#sys.argv –

+0

@Andy 수정 사항을 확인하십시오. – John