如何直接将代码应用于a中的所有文件并将xml文件转换为txt文件

Posted

技术标签:

【中文标题】如何直接将代码应用于a中的所有文件并将xml文件转换为txt文件【英文标题】:How to apply code to all the files in a directly and convert xml files to txt files 【发布时间】:2020-12-11 18:05:52 【问题描述】:

我正在尝试在 python 中应用代码以从每个 xml 文件中提取必要的信息并将它们写入 txt 文件。 我成功执行了我的代码,但结果只显示一个文件。 另外,我的代码看起来不太聪明,如果有人可以帮助我解决问题并给我一些修正,我将非常高兴。

恐怕我是初学者,所以我可能有很多基本错误......

这是我的代码


from xml.etree import ElementTree as ET
import os

path = r'/Users/mo/Documents/annotations/xmls'
filenames = []

for filename in os.listdir(path):
    if not filename.endswith('.xml'):
        continue
    fullname = os.path.join(path,filename)
    filenames.append(fullname)

each_name = filename[:-4]

with open(each_name + '.txt', 'a') as f:

    for filename in filenames:
        tree = ET.parse(filename)
        root = tree.getroot()

        for object in root.findall('object'):
            categoryID = object.find('name').text

            for bnd_box in object.findall('bndbox'):
                Xcenter = (int(bnd_box.find('xmax').text) - int(bnd_box.find('xmin').text))/2
                Ycenter = (int(bnd_box.find('ymax').text) - int(bnd_box.find('ymin').text))/2
                width = int(bnd_box.find('xmax').text)- int(bnd_box.find('xmin').text)
                height = int(bnd_box.find('ymax').text) - int(bnd_box.find('ymin').text)
                Detection_rows = str(categoryID) + str(Xcenter) + str(Ycenter) + str(width) + str(height) + '\n'

    f.write(str(Detection_rows))

非常感谢

【问题讨论】:

快速浏览一下代码似乎没有任何问题。您能确切地告诉我们为什么这不适合您吗? 非常感谢您的评论,它有点工作,但在目标文件中只创建了一个文件,但我想要更多,因为我在原始文件夹中有 2000 多个 xml 文件... 【参考方案1】:

试试这个(没有测试过

from xml.etree import ElementTree as ET
import os

path = r'/Users/mo/Documents/annotations/xmls'

for filename in os.listdir(path):
    if not filename.endswith('.xml'):
        continue
        
    fullname = os.path.join(path, filename)

    with open(fullname[:-4] + '.txt', 'a') as f:

        tree = ET.parse(fullname)
        root = tree.getroot()

        for object in root.findall('object'):
            categoryID = object.find('name').text

            for bnd_box in object.findall('bndbox'):
                Xcenter = (int(bnd_box.find('xmax').text) - int(bnd_box.find('xmin').text))/2
                Ycenter = (int(bnd_box.find('ymax').text) - int(bnd_box.find('ymin').text))/2
                width = int(bnd_box.find('xmax').text)- int(bnd_box.find('xmin').text)
                height = int(bnd_box.find('ymax').text) - int(bnd_box.find('ymin').text)
                Detection_rows = str(categoryID) + str(Xcenter) + str(Ycenter) + str(width) + str(height) + '\n'

        f.write(str(Detection_rows))

您的 for 循环应该在 open 之外,并且您将 filenames 更改为 filename。另外,我删除了一个不必要的 for 循环。让我知道它是否可以为您解决问题。

【讨论】:

哦 非常感谢您的快速回答!我现在就试试,然后把它拿回来!

以上是关于如何直接将代码应用于a中的所有文件并将xml文件转换为txt文件的主要内容,如果未能解决你的问题,请参考以下文章

转Android系统中的.apk文件和dex文件

如何读取 XML 文件并将信息放入对象中?

如何使用 JavaScript 过滤 xml 文件

如何访问数组并将其存储在python中的单个数组中(类似于matlab中的单元格)

[转]xml文件中的转义字符

如何将 xml 文件从 Internet 直接导入 Oracle 表