python读取xml文件报错ValueError: multi-byte encodings are not supported
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python读取xml文件报错ValueError: multi-byte encodings are not supported相关的知识,希望对你有一定的参考价值。
参考技术A问题 在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported
xml是用gb2312编码的。
很多贴子上说把xml的编码格式改为utf-8,就可以正常执行了。
但是这里有一个问题,xml原先的编码格式和encoding字段显示的编码格式都是gb2312,如果只改了encoding字段,之后再使用这个xml文件,就会按utf-8解析gb2312,会造成不可预知的后果。
第二个问题就是指改一个xml文件还好,但是有几百上千的时候,改这个就不方便了。
解决方案 用parseString函数
python提供了两种xml的输入方式,一种是文件,一种是字符串。我们可以先将xml文件读入内存,然后关闭文件。再将xml字符串中的gb2312用replace改为utf-8,然后用parseString解析,这样就不会报错。
注意事项 如果文件过大,有可能内存不够,所以适用于小的xml文件。注意要把不使用的文件给close掉,以免占用文件描述符。
python 模块之路 异常处理基础 异常处理其他 报错处理
什么是异常
[][1] IndexError #报错 指示误差 {}[‘key‘] KeyError #报错 字典关键字错误 pickle.load() EOFError #报错 读取异常 open(‘aa‘) FileNotFoundError #报错 文件内容不符 import aaaaa ModuleNotFoundError #报错 模块不符 格式错误 int(‘sdjkhf‘) ValueError #报错 给的值错误
语法错误 应该在写代码的时候就规避掉
# SyntaxError 语法错误 # NameError name 名称错误
什么时候最容易出异常 (当你要处理的内容不确定的时候)
有用户参与
有外界数据接入 : 从文件中读 或从网络上获取
# 当有多行报错的时候是为什么? # def func1(): # name # # def func2(): # func1() # # def main(): # func2() # # main() # 在嵌套调用的过程中,内部的代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部分 # 怎么解决 # 从下往上找 首先找到你写的代码 出错的那一行 # 看看能不能看出问题 # 就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题
单分支
l = [‘login‘,‘register‘] for num,i in enumerate(l,1): print(num,i) try: num = int(input(‘num >>>‘)) print(l[num - 1]) except ValueError : # except处理的异常必须和实际报错的异常是相同的 print(‘请输入一个数字‘) print(l[num - 1]) #如果给的值超出范围 则会报错 IndexError: list index out of range
指示误差 列表索引超出范围
多分支
# 多分支 # l = [‘login‘,‘register‘] # for num,i in enumerate(l,1): # print(num,i) # # try: # num = int(input(‘num >>>‘)) # print(l[num - 1]) # except ValueError : # # 从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支 # print(‘请输入一个数字‘) # except IndexError : # # 如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没有找到就会报错 # print(‘只能输入1或2‘) #规定输入 输入其他不行 就不会报错
多分支合并
# l = [‘login‘,‘register‘] # for num,i in enumerate(l,1): # print(num,i) # # try: # num = int(input(‘num >>>‘)) # print(l[num - 1]) # except (ValueError,IndexError) : # print(‘您输入的内容不合法‘) #规定 您输入内容不合法 不会报错
万能异常
def buy(): print(‘buy‘) name def back(): print(‘back‘) [][1] def show(): print(‘show‘) 1/0 def main(): l = [(‘购物‘,buy),(‘退货‘,back),(‘查看订单‘,show)] while True: for num,i in enumerate(l,1): print(num,i[0]) num = int(input(‘num >>>‘)) print(l[num - 1]) try: func = l[num - 1][1] func() except Exception: print(‘用户在选择了%s操作之后发生了不可知的异常‘ % l[num - 1][0]) main() #代码中已说明可能发生的异常
as语法 能够将具体错误信息打印出来
# def buy(): # print(‘buy‘) # name # # def back(): # print(‘back‘) # [][1] # # def show(): # print(‘show‘) # 1/0 # # def main(): # l = [(‘购物‘,buy),(‘退货‘,back),(‘查看订单‘,show)] # while True: # for num,i in enumerate(l,1): # print(num,i[0]) # num = int(input(‘num >>>‘)) # print(l[num - 1]) # try: # func = l[num - 1][1] # func() # except Exception as e: # print(e) # #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame) # print(‘用户在选择了%s操作之后发生了不可知的异常‘ % l[num - 1][0]) # # main()
万能异常, 相当于 Except Exception(异常)
try: name [][1] int(‘aaa‘) except: print(123) #int(整数) 打印123
多支行 + 万能异常 : 万能异常应该永远放在异常处理的最下面
def buy(): print(‘buy‘) name def back(): print(‘back‘) [][1] def show(): print(‘show‘) 1/0 def main(): l = [(‘购物‘,buy),(‘退货‘,back),(‘查看订单‘,show)] while True: for num,i in enumerate(l,1): print(num,i[0]) try: num = int(input(‘num >>>‘)) print(l[num - 1]) func = l[num - 1][1] func() except (ValueError,IndexError) : print(‘您输入的内容不合法‘) except Exception as e: print(e) #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame) print(‘用户在选择了%s操作之后发生了不可知的异常‘ % l[num - 1][0]) main() try: pass except (ValueError,IndexError): print(‘针对性的处理‘) except Exception as e: print(e) print(‘通用性的处理‘)
else分支
try: print(‘aaa‘) # 给某某某发邮件 # name # [][1] # 1/0 except NameError: # 网络不稳定,邮箱地址错误 print(‘name error‘) except IndexError: print(‘index error‘) except Exception as e: print(‘Exception‘) else: # 当try中的代码不发生异常的时候 走else分支 如果发送成功了 进行一些处理 print(‘else‘)
finally 分支
# try: # print(‘aaa‘) # 给某某某发邮件 # name # # [][1] # # 1/0 # except NameError: # 网络不稳定,邮箱地址错误 # print(‘name error‘) # except IndexError: # print(‘index error‘) # except Exception as e: # print(‘Exception‘) # else: # 当try中的代码不发生异常的时候 走else分支 如果发送成功了 进行一些处理 # print(‘else‘) # finally: # 无论如何都会被执行 # print(‘finally‘) # def func(): # f = open(‘file‘) # try: # while True: # for line in f: # if line.startswith(‘a‘): # return line # except: # print(‘异常处理‘) # finally: # 即使return也会先执行fianlly中的代码 # f.close() # try: # f = open(‘www‘,‘w‘) # f.read() # finally: # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序 # f.close() # print(‘文件已经关闭了‘) # finally用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
异常处理的几种情况
# try ... except # try ... except ... else # try ... finally # try ... except ... finally # try ... except ... else ... finally
主动抛出异常 : 是给其它开发者用的
# raise ValueError # raise ValueError(‘你写的不对‘) # django是别人写的程序 框架 --> 程序员用
断言 - 语法
# assert 1==2 # 只能接受一个布尔值 False # assert 1==1 # 只能接受一个布尔值 False # print(123456) # if 1 == int(input()): # pass # else: # raise AssertionError
自定义异常 : 面向对象之后
# 异常处理的忠告,在最外层的异常处理应该在所有的开发结束之后才放 # main() #sdhjlkghl # try: # main() # except Exception as e: # 把e报错写到文件里
努力 奋斗
以上是关于python读取xml文件报错ValueError: multi-byte encodings are not supported的主要内容,如果未能解决你的问题,请参考以下文章
python 模块之路 异常处理基础 异常处理其他 报错处理
tensorflow读取jpg格式图片报错 ValueError: Only know how to handle extensions: ['png']; with Pillow i
使用numpy.loadtxt()总是报错ValueError: could not convert string to float: 213