如何使用python将xml文件中的特定值转换成csv文件?

用户

我试图提取object、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>

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

^{pr2}$

我希望如此 姓名xmin ymin xmax ymax ymax 2 40 1 69 42 10 67 3 101 43 1 122 2 153 45 10151 3 183 44 2 186 4 216 47 5 214 5 245 46

但我只得到这两个头球

名称bndbox

没有价值


已被浏览了1966次
更新日期: 2020-10-22 23:57:51
2 个回答
fefe Tyson

如果可以使用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将是一个^{}对象,它是xml树的表示形式。在

使用了xml parser。在

然后使用find_all()函数查找xml中的所有<object>标记。结果存储在tgs。在

现在,从tgs中的元素,即<object>的子标记,我们选择所需的标记,它们是^{}对象,并使用它们的string属性获得它们的值。在

我们可以使用string属性访问name中的值,但是name Tag类的一个属性的名称。所以我们首先使用find()来获得<name>子元素<object>,然后我们得到了它的内容。在

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

^{pr2}$

我们会得到

('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')
评论 - 2020年9月22日 13:38
fefe Tyson

代码:

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])

输出:

^{pr2}$
评论 - 2020年9月22日 13:38

最新Python问答

推荐Python问答