• xml转txt出现以下报错该如何解决


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 mylucky777 2024-04-13 10:48 采纳率: 0% 浏览 5 首页/ 移动开发 / xml转txt出现以下报错该如何解决 xml 在进行yolov5学习中,标签格式转化中xml.转txt中报错以下问题,请问各位应该如何解决该问题,感谢感谢!报错: 以下为我的转化代码: # 以东北大学钢铁数据集标签为例 import xml.etree.ElementTree as ET#xml 是python自带的package import os classes=['Missing_hole','Mouse_bite','Open_circuit','Short','Spur','Spurious_copper']#写自己的分类名 pre_dir=r'E:\BS\train\labels'#xml文件所在文件夹 target_dir=r'E:\BS\train\labeltxt'#想要存储txt文件的文件夹 path=os.listdir(pre_dir) for path1 in path: # path1=r'C:\Users\loadlicb\Desktop\chrome_RTJOXXsYHM.xml'#xml文件路径 tree=ET.parse(os.path.join(pre_dir,path1)) root=tree.getroot()#这两个步骤将xml文件拆出来了 oo=[] for child in root: if child.tag == 'filename':#tag对应的是《》中的内容,text对应的是两个《》中间的部分内容 oo.append(child.text)#获得xml文件的名 # print(child.text) for i in child: if i.tag == 'width':#获得图片的w oo.append(i.text) # print(i.text) if i.tag == 'height':#获得图片的h oo.append(i.text) # print(i.text) if i.tag == 'name':#获得当前框的class oo.append(i.text) # print(i.text) for j in i: if j.tag == 'xmin':#获得当前框的两个对角线上的点的两组坐标 oo.append(j.text) # print(j.text) if j.tag == 'ymin': oo.append(j.text) # print(j.text) if j.tag == 'xmax': oo.append(j.text) # print(j.text) if j.tag == 'ymax': oo.append(j.text) # print(j.text) print(oo) filename=oo[0]#读取图片的名和宽高 filename=os.path.split(filename) # print(filename) name,extension=os.path.splitext(filename[1])#获取xml名和后缀 width=oo[1] dw=1/int(width) height=oo[2] dh=1/int(height) oo.pop(0) oo.pop(0) oo.pop(0)#删除三次oolist的0号元素 back=[] # print((len(oo))%5) for i in range(len(oo)//5): for p in range(len(classes)):#划定class的序号 if classes[p] == oo[5*i]:#str == str cl=p back.append(cl) x=(int(oo[5*i+1])+int(oo[5*i+3]))/2#oo里的所有元素都是str,数字也是 y = (int(oo[5 * i + 2]) + int(oo[5 * i + 4])) / 2#计算标注框的中心点的xy坐标 w=int(oo[5*i+3])-int(oo[5*i+1]) h=int(oo[5*i+4])-int(oo[5*i+2])#计算标注框的宽高 back.append('{:.4f}'.format(x*dw)) back.append('{:.4f}'.format(y * dh)) back.append('{:.4f}'.format(w * dw)) back.append('{:.4f}'.format(h * dh)) # back.append(y*dh) # back.append(w*dw) # back.append(h*dh)#转换到0-1区间 print(back) # dir=r'C:\Users\loadlicb\Desktop'#label文件夹名 file=open(os.path.join(target_dir,name+'.txt'),'w') for i in range(len(back)): l=' ' if (i+1)%5==0: l='\n' file.writelines(str(back[i])+l)#完成了,现在进行批量操作修改 #完成 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 10:48
      关注

      引自免费微信小程序:皆我百晓生

      看起来你正在尝试使用Python的ElementTree模块解析一个XML文件,但遇到了权限错误(Permission denied)。这通常意味着你没有足够的权限访问或读取这个文件。要解决这个问题,你可以尝试以下几种方法:

      1. 检查文件路径:确保提供的文件路径是正确的,并且文件确实存在于那个位置。可以将完整的文件路径打印出来,确认是否正确。
      print(os.path.join(predir, path1))
      
      1. 修改文件权限:如果你有管理员权限,可以尝试提升权限或更改文件的所有者。但在Windows系统上,你需要右键点击文件 -> 属性 -> 安全选项卡,然后添加或更改权限设置。

      2. 运行IDE作为管理员:在Windows系统中,尝试以管理员身份运行PyCharm或其他IDE,这样可能会允许你访问受保护的文件。

      3. 使用相对路径:有时候绝对路径可能会导致问题,尝试使用相对于脚本执行目录的相对路径。

      4. 检查文件是否被其他程序占用:可能是因为另一个程序已经打开了这个文件,导致你无法读取。关闭可能占用该文件的应用程序后重试。

      如果你能提供更多的上下文信息,比如你使用的代码片段,我可以给出更具体的建议。这里是一个基础的例子,展示了如何使用ElementTree模块解析XML文件:

      import os
      import xml.etree.ElementTree as ET
      
      def convert_xml_to_txt(xml_file_path, txt_output_path):
          try:
              # 使用异常处理来捕获并处理可能出现的错误
              tree = ET.parse(xml_file_path)
              root = tree.getroot()
      
              with open(txt_output_path, "w") as f:
                  for child in root:
                      # 假设XML中的每个元素都有一个名为'tag_name'的子元素,我们需要将其写入txt文件
                      tag_name = child.find('tag_name').text
                      f.write(tag_name + "\n")
      
          except FileNotFoundError:
              print(f"File {xml_file_path} not found.")
          except PermissionError:
              print("Permission denied to access the file.")
          except Exception as e:
              print(f"An error occurred: {str(e)}")
      
      # 调用函数,替换为你的实际路径
      predir = "E:\\BS\\train\\labels"
      path1 = "Annotations\\yourfile.xml"
      txt_output_path = "output.txt"
      
      convert_xml_to_txt(os.path.join(predir, path1), txt_output_path)
      

      这段代码会从给定的XML文件中提取名为'tag_name'的子元素的文本,并将其写入到TXT文件中。请根据你的实际情况调整XML结构和输出格式。

      展开全部

      评论 编辑记录
    • 专家-百锦再 全栈领域优质创作者 2024-04-13 10:48
      关注

      在进行yolov5学习中,标签格式转化中xml转txt中报错的问题可能是因为转化过程中出现了错误或者缺少必要的信息所导致的。 
      为了解决该问题,可以尝试以下几种方法:1. 检查xml文件格式是否正确,确保每个标签都有相应的开始和结束标记。2. 检查标签内容是否符合yolov5的要求,如是否缺少必要的标签信息。3. 检查转化工具的设置是否正确,确保转化过程中没有遗漏或错误的设置。4. 可以尝试使用其他的转化工具或方法,看是否能够成功转化xml标签格式为txt格式。
      如果以上方法都无法解决问题,建议查阅yolov5的官方文档或在相关社区寻求帮助,寻求更专业的支持和解决方案。

      有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
      评论
    • GISer Liu 2024-04-13 12:33
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据你提供的代码和报错信息,问题可能出现在标签转换的部分。具体来说,报错信息中提到了"IndexError: list index out of
      range",这意味着你的代码在尝试访问一个超出列表范围的索引位置,导致程序崩溃。
      在你的代码中,有一段涉及弹出列表元素的操作:
      pythonCopy code

      oo.pop(0)
      oo.pop(0)
      oo.pop(0)
      

      这段代码可能会导致问题。因为你删除了前三个元素,但在后续的循环中,你又使用了oo列表的第一个元素作为文件名:
      pythonCopy code

      filename=oo[0]
      

      这会导致oo列表为空,因为前三个元素已经被删除。因此,当你尝试访问oo[0]时,就会出现"IndexError: list
      index out of range"的错误。
      要解决这个问题,你可以考虑不删除``` oo

      pythonCopy code
      

      filename = os.path.split(path1)[-1] # 获取文件名
      name, extension = os.path.splitext(filename) # 获取文件名和后缀

      这样就不需要删除 oo ```列表的元素了。
      另外,你还可以考虑在读取xml文件时进行更加严格的错误处理,以确保程序可以正常处理各种不同格式的xml文件,避免出现意外情况导致程序崩溃。
      综上所述,你可以通过修改文件名获取的方式和增加错误处理来解决报错问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 13:14
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      问题描述:在进行xml到txt转化的时候,出现了PermissionError:[Errno 13]Permission denied错误。

      解决方案:

      1.检查所需文件和文件夹的权限和路径是否正确。在操作文件时,需要保证文件夹和文件有可读写权限,如果无法操作,可能是权限不足或者路径错误。

      2.修改所需文件或文件夹的权限。将缺少权限的文件或文件夹的权限更改为可读写,使用chmod命令或者其他权限管理工具。

      3.更改python进程的权限,使用管理员权限运行操作系统或者Pycharm等运行环境。

      4.检查所需文件和文件夹是否存在,如果不存在,创建该文件或文件夹,并将其权限更改为可读写。

      修改后的代码:

      import xml.etree.ElementTree as ET
      import os
      
      classes=['Missing_hole','Mouse_bite','Open_circuit','Short','Spur','Spurious_copper']
      pre_dir=r'E:\BS\train\labels'
      target_dir=r'E:\BS\train\labeltxt'
      
      path=os.listdir(pre_dir)
      
      for path1 in path:
          if path1.endswith('.xml'):
              tree=ET.parse(os.path.join(pre_dir,path1))
              root=tree.getroot()
              oo=[]
              for child in root:
                  if child.tag == 'filename':
                      oo.append(child.text)
                      # print(child.text)
                  for i in child:
      
                      if i.tag == 'width':
                          oo.append(i.text)
                          # print(i.text)
                      if i.tag == 'height':
                          oo.append(i.text)
                          # print(i.text)
                      if i.tag == 'name':
                          oo.append(i.text)
                          # print(i.text)
      
                      for j in i:
                          if j.tag == 'xmin':
                              oo.append(j.text)
                              # print(j.text)
                          if j.tag == 'ymin':
                              oo.append(j.text)
                              # print(j.text)
                          if j.tag == 'xmax':
                              oo.append(j.text)
                              # print(j.text)
                          if j.tag == 'ymax':
                              oo.append(j.text)
                              # print(j.text)
              print(oo)
              filename=oo[0]
              filename=os.path.split(filename)
      
              name,extension=os.path.splitext(filename[1])
              width=oo[1]
              dw=1/int(width)
              height=oo[2]
              dh=1/int(height)
              oo.pop(0)
              oo.pop(0)
              oo.pop(0)
      
              back=[]
      
              for i in range(len(oo)//5):
                  for p in range(len(classes)):
                      if classes[p] == oo[5*i]:
                          cl=p
                          back.append(cl)
                  x=(int(oo[5*i+1])+int(oo[5*i+3]))/2
                  y = (int(oo[5 * i + 2]) + int(oo[5 * i + 4])) / 2
                  w=int(oo[5*i+3])-int(oo[5*i+1])
                  h=int(oo[5*i+4])-int(oo[5*i+2])
                  back.append('{:.4f}'.format(x*dw))
                  back.append('{:.4f}'.format(y * dh))
                  back.append('{:.4f}'.format(w * dw))
                  back.append('{:.4f}'.format(h * dh))
      
              print(back)
      
              file=open(os.path.join(target_dir,name+'.txt'),'w')
              for i in range(len(back)):
                  l=' '
                  if (i+1)%5==0:
                      l='\n'
                  file.writelines(str(back[i])+l)
      

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    基于SpringBoot和PostGIS的世界各国邻国可视化实践
    支付宝"手机网站支付"主域名申请了,二级域名还要申请吗
    11后端开发就是CRUD?没那么简单!
    1731. 每位经理的下属员工数量
    XML文件
    kubernetes Service详解
    java -数据结构,单向链表
    【Java力扣《代码随想录》】第4章链表63-69题(leetcode题号203+707+206+24+19+面试题02.07+142)
    JavaScript 对象增删改查 + 遍历对象+内置函数 + 随机对象
    安卓实现微信朋友圈查看图片功能
  • 原文地址:https://ask.csdn.net/questions/8087727