报错内容的主要部分:
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position
123: illegal multibyte sequence
问题产生
在做目标检测时,使用的数据集来自网络,在将xml和图片转换到特定格式时,有些xml文件解析出现了问题。像这样:
我发现,当我未使用labelImg工具,而直接通过记事本手动修改xml文件时,或者通过脚本批量修改xml文件时就会出现这个问题。
分析问题
以下为两个xml文件,里面的内容基本一样、格式完全相同,仔细观察发现:
可以正常解析的xml文件编码格式是LF
而不能正常解析的xml文件编码格式是CRLF
解释以下(参考)
- CR:Carriage Return,对应ASCII中转义字符\r,表示回车
- LF:Linefeed,对应ASCII中转义字符\n,表示换行
- CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
众所周知,Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。
解决方法
1 首先我们需要下载一个强大的工具Dos2Unix,下载地址(可能被墙 ) ,百度云(提取码:e8cj)。
2 配置环境变量,步骤省略。
3 打开命令窗口,开始批量转换。
在命令窗口输入
for /R 文件路径 %G in (*.c *.cc *.h *.xml) do dos2unix "%G" # *.c *.cc *.h *.xml 表示任意匹配这些后缀名的文件
当出现以下内容,说明转换成功: