【问题标题】:How convert multiple xml files in a folder in csv files with python?如何使用python转换csv文件中文件夹中的多个xml文件?
【发布时间】:2023-11-20 20:48:01
【问题描述】:

1-我已经准备好将 de xml 文件转换为 csv 的代码。但实际上我需要多次执行此操作,然后每次都需要更改程序中 xml 文件的名称。我想做一个循环来读取文件夹位置中的每个“.xml”文件并执行所有文件。有我原来的代码

import xml.etree.ElementTree as ET
import csv

tree = ET.parse("Shot_30AA.xml")
root = tree.getroot()

Shot_30AA = open('Shot_30AA.csv', 'w', newline='')
csvwriter = csv.writer(Shot_30AA)
head = []

ShotCode = root.attrib['ShotCode']
csvwriter.writerow(['ShotCode', ShotCode])
head.append(ShotCode)

for member in root.getchildren():
  submembers = member.getchildren()
  keys = submembers[0].attrib.keys()
  csvwriter.writerow ("\n")
  csvwriter.writerow(keys)
  for submember in submembers:
    row_data = [submember.attrib[k] for k in keys]
    csvwriter.writerow(row_data )
Shot_30AA.close()

我尝试在我的文件夹中执行此操作,添加闲置代码只执行一次

path = 'C:/Users/Desktop/Program'
for filename in os.listdir(path):
   if not filename.endswith('.xml'): continue
     ShotFile = os.path.join(path, filename)
     tree = ET.parse(ShotFile)
     root = tree.getroot()

     filename = open( filename'.csv', 'w', newline='')
     csvwriter = csv.writer(filename)
     head = [] 

     ShotFile = open('ShotFile.csv', 'w', newline='')
     csvwriter = csv.writer(Shot_30AA)
     head = []

     ShotCode = root.attrib['ShotCode']
     csvwriter.writerow(['ShotCode', ShotCode])
     head.append(ShotCode)

     for member in root.getchildren():
       submembers = member.getchildren()
       keys = submembers[0].attrib.keys()
       csvwriter.writerow ("\n")
       csvwriter.writerow(keys)
       for submember in submembers:
         row_data = [submember.attrib[k] for k in keys]
         csvwriter.writerow(row_data )
  ShotFile.close()

我希望通过一次运行获得所有 csv 格式的文件。

【问题讨论】:

    标签: python xml csv for-loop rename


    【解决方案1】:

    以下是根据您的代码可行的方法

    def make_csv(folderpath, xmlfilename):
        tree = ET.parse(os.path.join(folderpath, xmlfilename))
        root = tree.getroot()
        filename, _ = xmlfilename.rsplit('.', 1)
        Shot_30AA = open(filename+'.csv', 'w', newline='')
        csvwriter = csv.writer(Shot_30AA)
        head = []
    
        ShotCode = root.attrib['ShotCode']
        csvwriter.writerow(['ShotCode', ShotCode])
        head.append(ShotCode)
    
        for member in root.getchildren():
            submembers = member.getchildren()
            keys = submembers[0].attrib.keys()
            csvwriter.writerow("\n")
            csvwriter.writerow(keys)
            for submember in submembers:
                row_data = [submember.attrib[k] for k in keys]
                csvwriter.writerow(row_data)
        Shot_30AA.close()
    
    path = 'C:/Users/Desktop/Program'
    for filename in os.listdir(path):
        if filename.endswith('.xml'):
            make_csv(path, filename)
    

    编辑 1:正如 cmets 所指出的,您在处理文件时还应该查看with open() as clause

    【讨论】:

    • 只是一个小评论(因为原始发布者可能不知道):我们应该使用 with 子句打开文件(with open(....) as Shot_30AA:) 以确保该文件在每种情况下都会关闭(在异常情况下也是如此)。那么我们也不需要自己调用close。
    • @jottbe 是的,我同意你的观点,但我不想给 OP 介绍太多新东西
    最近更新 更多