【问题标题】:How to get specific values from a xml file into csv file using python?如何使用 python 将 xml 文件中的特定值转换为 csv 文件?
【发布时间】:2019-09-24 23:27:53
【问题描述】:

我正在尝试提取每个对象标签的对象、xmin、ymin、xmax 和 xmax 值。

XML

<annotation>
    <folder>Plates_Number</folder>
    <filename>1.png</filename>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>294</width>
        <height>60</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>2</name>
        <pose>Unspecified</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>40</xmin>
            <ymin>1</ymin>
            <xmax>69</xmax>
            <ymax>42</ymax>
        </bndbox>
    </object>
    <object>
        <name>10</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>67</xmin>
            <ymin>3</ymin>
            <xmax>101</xmax>
            <ymax>43</ymax>
        </bndbox>
    </object>
    <object>
        <name>1</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>122</xmin>
            <ymin>2</ymin>
            <xmax>153</xmax>
            <ymax>45</ymax>
        </bndbox>
    </object>
    <object>
        <name>10</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>151</xmin>
            <ymin>3</ymin>
            <xmax>183</xmax>
            <ymax>44</ymax>
        </bndbox>
    </object>
    <object>
        <name>2</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>186</xmin>
            <ymin>4</ymin>
            <xmax>216</xmax>
            <ymax>47</ymax>
        </bndbox>
    </object>
    <object>
        <name>5</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>214</xmin>
            <ymin>5</ymin>
            <xmax>245</xmax>
            <ymax>46</ymax>
        </bndbox>
    </object>
</annotation>

这是我尝试过的,但没有得到预期的结果

python

import xml.etree.ElementTree as ET
import csv

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

# open a file for writing

data = open('test.csv', 'r+')

# create the csv writer object

csvwriter = csv.writer(data)
data_head = []

count = 0
for member in root.findall('object'):
    obj = []
    bndbox_list = []
    if count == 0:
        name = member.find('name').tag
        data_head.append(name)
        bndbox = member[4].tag
        data_head.append(bndbox)
        csvwriter.writerow(data_head)
        count = count + 1

    name = member.find('name').text
    obj.append(name)
    bndbox = member[4][0].text
    bndbox_list.append(bndbox)
    xmin = member[4][1].text
    bndbox_list.append(xmin)
    ymin = member[4][2].text
    bndbox_list.append(ymin)
    xmax = member[4][3].text
    bndbox_list.append(xmax)
    ymax = member[4][4].text
    bndbox_list.append(ymax)
    obj.append(bndbox)
    csvwriter.writerow(data)
data.close()

我期待 名称 xmin ymin xmax ymax 2 40 1 69 42 10 67 3 101 43 1 122 2 153 45 10 151 3 183 44 2 186 4 216 47 5 214 5 245 46

但我只得到这两个标题

名称 bndbox

没有价值

【问题讨论】:

    标签: python xml-parsing


    【解决方案1】:

    代码:

    import xml.etree.ElementTree as ET
    
    root = ET.parse('file.xml').getroot()
    
    
    for type_tag in root.findall('object'):
        name = type_tag.find('name').text
        xmin = type_tag.find('bndbox/xmin').text
        ymin = type_tag.find('bndbox/ymin').text
        xmax = type_tag.find('bndbox/xmax').text
        ymax = type_tag.find('bndbox/ymax').text
    
        print([name,xmin,ymin,xmax,ymax])
    

    输出:

    ['2', '40', '1', '69', '42']
    ['10', '67', '3', '101', '43']
    ['1', '122', '2', '153', '45']
    ['10', '151', '3', '183', '44']
    ['2', '186', '4', '216', '47']
    ['5', '214', '5', '245', '46']
    

    【讨论】:

      【解决方案2】:

      如果你可以使用BeautifulSoup,你可以使用

      from bs4 import BeautifulSoup
      soup = BeautifulSoup(input_xml_string)
      tgs = soup.find_all('object', 'xml')
      l = [(i.find('name').string, i.xmin.string, i.ymin.string, i.xmax.string, i.ymax.string) for i in tgs]
      

      其中input_xml_string 是字符串形式的输入xml。

      soup 将是一个 BeautifulSoup 对象,它是 xml 树的表示。

      使用了一个 xml parser

      然后find_all()函数用于查找xml中的所有&lt;object&gt;标签。结果存储在tgs

      现在,从tgs 中的元素(可能是&lt;object&gt; 的子标签)中,我们选择我们需要的标签,即Tag 对象,并使用它们的string 属性获取它们的值。

      我们可以使用string 属性访问name 中的值,但name Tag 类的属性名称。所以我们首先使用find() 来获取&lt;object&gt;&lt;name&gt; 孩子,然后我们得到它的内容。

      现在如果我们打印l中的值,

      for i in l:
          print(i)
      

      我们会得到,

      ('2', '40', '1', '69', '42')
      ('10', '67', '3', '101', '43')
      ('1', '122', '2', '153', '45')
      ('10', '151', '3', '183', '44')
      ('2', '186', '4', '216', '47')
      ('5', '214', '5', '245', '46')
      

      【讨论】:

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