首页 > 其他分享 >读取xml文件写到csv文件中

读取xml文件写到csv文件中

时间:2024-10-10 13:47:28浏览次数:12  
标签:xml 文件 elif return damage xmax csv type

#xml数据提取,拼合为csv文件

import os
import csv
import xml.dom.minidom
import glob




def to_int(str_value):
    try:
        return int(str_value)
    except ValueError:
        try:
            float_value = float(str_value)
            return int(float_value)
        except ValueError:
            return None

def get_damage_code(damage_type):
    """
    根据损伤类型返回相应的代码。

    参数:
    damage_type (str): 损伤类型名称。

    返回:
    int: 对应的损伤代码,如果损伤类型未知则返回None。
    """
    if damage_type == "bolt":
        return 30
    elif damage_type == "bolt crack":
        return 31
    elif damage_type == "head_unknow_1":
        return 501
    elif damage_type == "head_unknow_2":
        return 502
    elif damage_type == "head_unknow_3":
        return 503
    elif damage_type == "joint":
        return 600
    elif damage_type == "joint_1":
        return 601
    elif damage_type == "joint_3":
        return 602
    elif damage_type == "jietou":
        return 300
    elif damage_type == "phantom wave":
        return 504
    elif damage_type == "linehole":
        return 32
    elif damage_type == "bolt_loss_white":
        return 701
    elif damage_type == "bolt_loss_red":
        return 702
    elif damage_type == "bolt_crack_h":
        return 703
    elif damage_type == "head crack":
        return 505
    elif damage_type == "bottom crack":
        return 800
    elif damage_type == "badMidBolt":
        return 704
    elif damage_type == "hanfengMidFlaw":
        return 900
    elif damage_type == "unknown_45_white":
        return 705
    elif damage_type == "unknown_45_red":
        return 706
    else:
        return None  # 如果损伤类型不匹配任何已知类型,则返回None

def xml_to_csv(xml_files, csv_path):
    last_max_xmax = 0  # 初始化前一个文件的xmax最大值

    # 打开一个新的CSV文件用于写入
    with open(csv_path, 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile)
        # 写入CSV的表头
        csvwriter.writerow(['xmin', 'ymin', 'xmax', 'ymax','Injury'])

        # 遍历所有XML文件
        for xml_file in xml_files:
            dom = xml.dom.minidom.parse(xml_file)
            root = dom.documentElement

            local_max_xmax = 0  # 初始化当前文件的xmax最大值

            # 获取所有bndbox节点
            bndboxes = root.getElementsByTagName('object')

            # 遍历每个bndbox节点
            for bndbox in bndboxes:
                xmin = to_int(bndbox.getElementsByTagName('xmin')[0].firstChild.data)
                ymin = to_int(bndbox.getElementsByTagName('ymin')[0].firstChild.data)
                xmax = to_int(bndbox.getElementsByTagName('xmax')[0].firstChild.data)
                ymax = to_int(bndbox.getElementsByTagName('ymax')[0].firstChild.data)
                Injury = get_damage_code(bndbox.getElementsByTagName('name')[0].firstChild.data)
                # 如果这不是第一个文件,将前一个文件的xmax最大值加到当前文件的xmin值上
                if last_max_xmax > 0:
                    xmin += last_max_xmax+3000
                    xmax += last_max_xmax+3000
                 # 更新当前文件的xmax最大值
                if xmax is not None:
                    local_max_xmax = max(local_max_xmax, xmax)
                    print(local_max_xmax)
                # 写入每个节点的值到CSV
                csvwriter.writerow([xmin, ymin, xmax, ymax,Injury])
            # 更新全局xmax最大值
            last_max_xmax = local_max_xmax

def get_xml_files(path):
    # 使用glob模块获取所有XML文件
    return glob.glob(os.path.join(path, '*.xml'))

if __name__ == '__main__':
    # xml_path = 'F:\\zhengwangwork\\H\\样本\\完整的伤损样本库20240313\\完整的伤损样本库20240308\\xml'
    # xml_path = 'F:\\testcsv\\xml'
    xml_path = 'F:\\png'
    # csv_path = 'F:\\testcsv\\output_xml.csv'
    csv_path = 'F:\\testcsv\\6.csv'
    xml_files = get_xml_files(xml_path)
    xml_to_csv(xml_files, csv_path)

标签:xml,文件,elif,return,damage,xmax,csv,type
From: https://blog.csdn.net/weixin_45503872/article/details/142819788

相关文章

  • chatGPT:清理 master 分支的文件,并让这个分支只有一个提交
    Q我的开发工作都在master分支上做的,master分支有很多的开发的时候产生的临时文件。我想清空master分支的历史记录。并且只保留README.md和main.pyA你可以通过以下步骤清空master分支的历史记录,只保留README.md和main.py文件:步骤1:创建一个干净的分支首先,确保......
  • U盘中毒了?教你如何删除System Volume Information这个顽固文件夹「建议收藏」
     不得不说cmd命令很好用呢。最近我的U盘中毒了,格式化都删除不了SystemVolumeInformation这个顽固的文件夹,真心伤不起哇!还好现在解决了问题。看来以后得好好对待U盘,不能乱用了。本篇文章教大家如何删除SystemVolumeInformation这个顽固文件夹。希望对你有用。我的......
  • Windows11系统madrid.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个madrid.dll文件(挑选合适的版本文件)把它放......
  • Windows11系统LxssManager.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LxssManager.dll文件(挑选合适的版本文件)把......
  • Win11系统提示找不到storewuauth.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个storewuauth.dll文件(挑选合适的版本文件)把......
  • 4.文件规划:让你的Python更加简洁
    在上一篇文章之中,小编简单的介绍了目前Python中主流的三大Web框架,分别是Django、Flask和FastAPI,并且介绍了它们的优缺点。并且,我们快速的使用FastAPI搭建了一个简单的RestFul风格的接口,并且使用unicorn作为Web服务器,来向外提供服务。最后,我们使用我们学习到的FastAPI知识,......
  • 织梦数据库在哪个文件夹
    织梦CMS(DEDECMS)的数据库文件本身并不直接存储在织梦的文件系统中,因为数据库通常是独立运行在数据库服务器上的,比如MySQL服务器。不过,织梦CMS会有一些与数据库相关的文件和备份文件存储在其文件系统中:数据库配置文件:存储位置:/data/common.inc.php这个文件包含了数据库连接的......
  • QT中vtk读取nii文件并修改其中标签
    //获取读取器的输出数据vtkSmartPointer<vtkNIFTIImageReader>reader=vtkSmartPointer<vtkNIFTIImageReader>::New();//设置读取器的输入文件名constchar*initNiiName="D:/initInput.nii";reader->SetFileName(initNiiName);//读取NII图像数据try{ reader-&......
  • python 打包 py 文件 为exe
    使用pyinstaller来进行打包pipinstallpyinstaller可能需要全局科学代理上网或者修改下载源地址执行命令图标path:C:\desktop\icon文件path:C:\pycharm\project\bingdundun.exe1、指定文件路径打包:pyinstaller-FC:\pycharm\project\bingdundun.exe2、不带窗......
  • .NetCore中下载文件接口指定文件名时中文被替换为下划线(_)的问题
      首先,我这里使用的.net6  比如我有这样一个接口:publicasyncTask<IActionResult>Download(stringname){//省略业务代码...returnFile(stream,"application/octet-stream",name);}  这里下载的文件名时接口参数传进来的,......