【问题标题】:How convert xml to csv file using python (in row)?如何使用python(行)将xml转换为csv文件?
【发布时间】:2019-06-11 18:34:12
【问题描述】:

我想在 cvs 中编码这个 xml 文档。我试过但它不起作用我不知道我做错了什么。我对此很陌生。

有我要转换的xml

<?xml version="1.0" encoding="UTF-8"?> 
<Shot 
  Shotcode = "30AA" 
  ShotDate = "4/2/2000"> 

 <Images> 

  <Image 
   ImageNumber="103" 
   RawFileName="18_Shot_30AA.jpg" /> 
  <Image 
   ImageNumber="104"  
   RawFileName="17_Shot_30AA.jpg" /> 
  <Image 
   ImageNumber="105" 
   RawFileName="14_Shot_30AA" /> 
 </Images> 

 <Metrics> 
  <Metric 
   Name = "30AA" 
   TypeId = "163" 
   Value = "0" /> 

 <Metric 
  Name = "Area" 
  TypeId = "10" 
  Value = "63" /> 
 </Metrics> 

</Shot>

我以这种形式编写代码,以完成一些示例,这不是完整的程序,而是显示我在做什么。

import xml.etree.ElementTree as ET
import csv

tree = ET.parse("30AA.xml")
root = tree.getroot()

30AA = open('30AA.csv', 'w+')
csvwriter = csv.writer(30AA)
head = []

count = 0   #loops
for member in root.findall('Shot'):
Shot = []
if count == 0:
    ShotCode = member.find('ShotCode').tag
    head.append(ShotCode)
    ShotDate = member.find('ShotDate').tag
    head.append(ShotDate)
    csvwriter.writerow(head)
    count = count + 1   
ShotCode = member.find('ShotCode').txt
Shot.append(ShotCode)
ShotDate = member.find('ShotDate').txt
Shot.append(ShotDate)   
30AA.close()

我期望的结果是

Shotcode    30AA    
ShotDate    4/2/2000    

Imagen  103 

Imagen  104 

Imagen  105 

Name TypeId Value
30AA  163   0
area  10    63

【问题讨论】:

  • 您显示的预期结果不是 csv 文件。为什么要使用 csv 模块来生成非 csv 文件?所有 csv 文件都是文本文件,但并非所有文本文件都是逗号分隔值文件...

标签: python xml csv


【解决方案1】:

好的,我想我知道出了什么问题,主要问题主要在于读取 xml 它看起来像是一个 csv 的东西。

你的 xml 的根是一个镜头标签,所以你不能使用 root.findall('Shot') 来获取所有标签,因为 root 已经是并且它里面没有任何镜头。 这就是为什么你在输出中没有得到任何东西的原因。

此外,当您想获取标签的属性时,您可以使用 .attrib['name_of_attribute'] 例如 member.find('ShotCode').tag 应该是 member.attrib['ShotCode']

这会改变脚本的其余部分,但您需要执行以下操作:

root = tree.getroot()

_30AA = open('30AA.csv', 'w+')
csvwriter = csv.writer(_30AA)
head = []

ShotCode = root.attrib['Shotcode']

csvwriter.writerow(['ShotCode', ShotCode])
head.append(ShotCode)
ShotDate = root.attrib['ShotDate']
csvwriter.writerow(['ShotDate', ShotDate])
# member is going to be the <Images> and <Metrics>
for member in root.getchildren():

    submembers = member.getchildren()
    # Write the names of the attributes as headings
    keys = submembers[0].attrib.keys()
    csvwriter.writerow(keys)
    for submember in submembers:

        row_data = [submember.attrib[k] for k in keys]
        csvwriter.writerow(row_data )

_30AA.close()

会给你你想要的

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 2019-12-01
    • 2021-05-08
    • 2021-11-21
    • 2021-07-31
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多