UnicodeXXXError 错误的原因
在字符编码转换操作时,遇到最多的问题就是 UnicodeEncodeError 和 UnicodeDecodeError 错误了,这些错误的根本原因在于 Python2 默认是使用 ascii 编码进行 decode 和 encode 操作,例如:
当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
学习Python中有不明白推荐加入交流群
号:960410445
群里有志同道合的小伙伴,互帮互助,
群里有不错的视频学习教程和PDF!!
CASE 1
>>> s = '你好'>>> s.decode()Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
当把 s 转换成 unicode 类型的字符串时,decode 方法默认使用 ascii 编码进行解码,而 ascii 字符集中根本就没有中文字符『你好』,所以就出现了 UnicodeDecodeError,正确的方式是显示地指定 UTF-8 字符编码。
>>> s.decode('utf-8')u'\u4f60\u597d'
同样地道理,对于 encode 操作,把 unicode字符串转换成 str类型的字符串时,默认也是使用 ascii 编码进行编码转换的,而 ascii 字符集找不到中文字符『你好』,于是就出现了UnicodeEncodeError 错误。
>>> a = u'你好'>>> a.encode()Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
CASE 2
str 类型与 unicode 类型的字符串混合使用时,str 类型的字符串会隐式地将 str 转换成 unicode字符串,如果 str字符串是中文字符,那么就会出现UnicodeDecodeError 错误,因为 python2 默认会使用 ascii 编码来进行 decode 操作。
>>> s = '你好' # str类型>>> y = u'python' # unicode类型>>> s + y # 隐式转换,即 s.decode('ascii') + uTraceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
正确地方式是显示地指定 UTF-8 字符编码进行解码
>>> s.decode('utf-8') +yu'\u4f60\u597dpython'
乱码
所有出现乱码的原因都可以归结为字符经过不同编码解码在编码的过程中使用的编码格式不一致,比如:
# encoding: utf-8 >>> a='好'>>> a'\xe5\xa5\xbd'>>> b=a.decode("utf-8")>>> bu'\u597d'>>> c=b.encode("gbk")>>> c'\xba\xc3'>>> print c��
utf-8编码的字符‘好’占用3个字节,解码成Unicode后,如果再用gbk来解码后,只有2个字节的长度了,最后出现了乱码的问题,因此防止乱码的最好方式就是始终坚持使用同一种编码格式对字符进行编码和解码操作。
一位月薪25K工程师学习python时整理的 ,python异常处理笔记
Python热爱者 4月4日
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。
python标准异常
- BaseException所有异常的基类
- SystemExit解释器请求退出
- KeyboardInterrupt用户中断执行(通常是输入^C)
- Exception常规错误的基类
- StopIteration迭代器没有更多的值
- GeneratorExit生成器(generator)发生异常来通知退出
- StandardError所有的内建标准异常的基类
- ArithmeticError所有数值计算错误的基类
- FloatingPointError浮点计算错误
- OverflowError数值运算超出最大限制
- ZeroDivisionError除(或取模)零 (所有数据类型)
- AssertionError断言语句失败
- AttributeError对象没有这个属性
- EOFError没有内建输入,到达EOF 标记
- EnvironmentError操作系统错误的基类
- IOError输入/输出操作失败
- OSError操作系统错误
- WindowsError系统调用失败
- ImportError导入模块/对象失败
- LookupError无效数据查询的基类
- IndexError序列中没有此索引(index)
- KeyError映射中没有这个键
- MemoryError内存溢出错误(对于Python 解释器不是致命的)
- NameError未声明/初始化对象 (没有属性)
- UnboundLocalError访问未初始化的本地变量
- ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
- RuntimeError一般的运行时错误
- NotImplementedError尚未实现的方法
- SyntaxErrorPython 语法错误
- IndentationError缩进错误
- TabErrorTab 和空格混用
- SystemError一般的解释器系统错误
- TypeError对类型无效的操作
- ValueError传入无效的参数
- UnicodeErrorUnicode 相关的错误
- UnicodeDecodeErrorUnicode 解码时的错误
- UnicodeEncodeErrorUnicode 编码时错误
- UnicodeTranslateErrorUnicode 转换时错误
- Warning警告的基类
- DeprecationWarning关于被弃用的特征的警告
- FutureWarning关于构造将来语义会有改变的警告
- OverflowWarning旧的关于自动提升为长整型(long)的警告
- PendingDeprecationWarning关于特性将会被废弃的警告
- RuntimeWarning可疑的运行时行为(runtime behavior)的警告
- SyntaxWarning可疑的语法的警告
- UserWarning用户代码生成的警告
异常处理
捕捉异常可以使用try/except语句。
实例
例一:
使用except而不带任何异常类型
捕获所有的异常
try-finally 语句
例一:
异常的参数
触发异常
我们可以使用raise语句自己触发异常
例一: