python 编码问题之终极解决
结合之前遇到的坑以及下面贴的这篇文章, 总结几种python乱码解决方案,如果遇到乱码,不妨尝试一下?
1,必备
#encoding=utf-8
2, python编程环境编码
import sys
reload(sys)
sys.setdefaultencoding('utf8')
3,不知道神马编码的时候用chardet查一下
from chardet import detect # detect(str),参数只能是str,不能是unicode编码的
if not isinstance(line, unicode):
line = line.decode(detect(line)['encoding']).rstrip().lower()
4,mysql 的默认字符集 latin1,Latin1是ISO-8859-1的别名,有些环境下写作Latin-1,ISO-8859-1编码是单字节编码,向下兼容ASCII
try:
line = line.rstrip().decode("utf-8").lower()
except UnicodeDecodeError:
line = line.decode('latin-1').rstrip().lower() # 很多网页采用这种编码格式,爬取网页的时候会遇到
5,读取oracle中文遇到问题的话,设置一下客户端编码
import os
os.environ['NLS_LANG']
= 'SIMPLIFIED CHINESE_CHINA.UTF8'
6, 非常好用的codecs, GB2312 < GBK < GB18030,
import codecs # 下载的txt文本在mac上打开乱码,这样子转一下就好了
fo = codecs.open('/Users/baidu/Desktop/spark/现代汉语常用词表.txt', 'rb', 'gbk')
fo = codecs.open('/Users/baidu/Desktop/spark/现代汉语常用词表.txt', 'rb', 'utf8')
fo = codecs.open('/Users/baidu/Desktop/spark/现代汉语常用词表.txt', 'rb', 'gb18030')
混合编码的情况最烦人,可以采用try:....UnicodeDecodeError:....去尝试不同解码方法,或者用chardet先检测再解码(但是有些编码格式字符串找不到解码方式)
总之,读进来先统一解码为unicode的格式,写出去都同一编写为utf-8格式(除非特殊要求)
附上各种编码教程 http://www.crifan.com/character_encoding_charset_simpile_tutorial/
【整理】Python中遇到"UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence"之类的编码或解码的错误时如何处理
原文 http://www.crifan.com/summary_python_unicodedecode_error_possible_reasons_and_solutions/
问题参见:
python2.7 urllib2 抓取新浪乱码
中的:
报错的异常是
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence
此问题,还是很具有代表性的,此处,专门整理如下:
【Python中如何处理UnicodeDecodeError和UnicodeEncodeError】
简答:
1.仔细分析错误的类型
2.搞清自己处理的字符串是什么类型的
3.然后换用这种的字符编码去编码或解码
详解:
以上面的错误:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence
为例,去解释,如何处理这类问题:
1.仔细分析错误的类型
(1)错误是Unicode的编码还是解码
对于此处,错误是:
UnicodeDecodeError
的类型的。
此英文,对应的中文的含义,其实已经很清楚了:
Unicode的解码(Decode)出现错误(Error)了
而对于上面这句,我们可以推断出:
你当前正在处理某种编码类型的字符串
此处你要处理字符串,是想要将该字符串去解码decode,变成Unicode
但是将该字符串解码变成Unicode期间,却出错了
(2)所用的是何种编码
好的,接着看上面的错误:
‘gbk’ codec can’t decode
使得错误信息更加明显了:
你此处,要将字符串解码为Unicode,是以gbk编码的方式去解码(该字符串变成Unicode)的
但是此处通过gbk的方式,却无法解码(can’t decode )
注:此处的codec,意思是:编解码(器),是Python内部的模块,用来编码或解码(字符串)的
(3)错误位置
bytes in position 2-3
此处的信息,后续一般也很少用到。
有时候会用于定位具体错误的位置。
此处暂且忽略。
(4)错误的细节错误类型
illegal multibyte sequence
翻译为中文为:
非法的,多字节,序列
简单说就是:
没法(解码)了。
【原因及解决办法】
好了,针对于上面所分析出来的信息:
将一个字符串,通过gbk的方式,去解码,想要获得Unicode字符串,结果出错了
我们来说说原因和解决办法:
此种错误,有几种可能:
(1)要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码
比如,字符串本身是utf-8的,但是你却用gbk去解码utf-8的字符串,所以结果不用说,则必然出错
则必然会出现这类的错误,说是,用gbk的方式去解码字符串,想要获得Unicode字符串,但是结果却解码出错了
解决办法:
如果你确定当前字符串,比如抓取网页通过charset=utf-8,已经确定html的字符串是utf-8的,
则可以直接去通过utf-8去解码。
相关参考内容:
详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
中的:
【整理】关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释
而如果本身对于所处理的字符串,不太清楚是什么编码类型的,可以尝试去通过chardet等模块,去检测看看:
【教程】如何用Python中的chardet去检测字符编码类型
然后搞清楚了,确定了,字符串是什么类型,然后再去解码。
提示:
关于字符串编码的类型,作为背景学习知识,也应该去了解一下。
这样对于以后处理字符串方面,会更有帮助。
(2)你没有主动的去将字符串编码为对应的Unicode,但是结果也报上面的UnicodeDecodeError的错误
这个情况,最常见的,就是我之前在:
【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法
所整理过的:
“Python中,打印字符串时,字符串本身的编码,与输出终端中所用编码不匹配”
此处不再赘述,只简要再说一下:
如果你本身拿到的是utf-8等,非gbk编码的字符串,然后用print去打印出来
在windows系统就是输出到cmd中
而cmd中,(对于多数中国人所用的是中文的系统)默认字符编码是gbk
从而导致此种现象:
python要将utf-8编码的字符串,在gbk的cmd的中打印出来
所以先要去尝试,用gbk的编码,解码为Unicode然后再打印出来
结果就出现此处的错误了。
详细解释,还是参见上面的教程。
其中还有示例代码的。
(3)处理的字符的确是gbk的,但是其中夹杂的部分特殊字符,是gbk编码中所没有的
如果有些特殊字符是GB18030中有的,但是是gbk中没有的。
则用gbk去解码,去所不支持的字符,也比如会出错。
所以,此种情况,可以尝试用和当前编码(gbk)所兼容的但所包含字符更多的编码(gb18030)去解码,或许就可以了。
提示:
如果对于GBK,GB18030,以及GB2312不了解,则可参考:
字符编码简明教程
另外:
如果遇到其他的,类似此中错误的,比如:
UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
等类型的错误,你就可以按照上述的思路,去分析,错误的现象,原因,然后通过自己,就可以找到解决办法了。
注:
其他和这类错误相关的,也还有一些可以参考的:
【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得
中的:“返回的html内容是乱码”
python 编码问题之终极解决的更多相关文章
- python 编码报错问题 'ascii' codec can't encode characters 解决方法
python在安装时,默认的编码是ascii, 当程序中出现非ascii编码时,python的处理常常会报这样的错 'ascii' codec can't encode characters pyth ...
- 彻底解决Python编码问题
1. 基本概念 字符集(Character set) 解释:文字和符合的总称 常见字符集: Unicode字符集 ASCII字符集(Unicode子集) GB2312字符集 编码方法(Encoding ...
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
- python编码问题大终结
一.了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...
- python编码问题一点通
一.了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...
- python编码错误
初学python,遇到的最难忘的坑没有之一.这个问题起码困扰了我一周.在我写了一段代码之后经常遇见这样的报错. 本质原因是我用的python2,在编码流派中python2是比较奇葩的一派,不随大流.所 ...
- python编码详解--转自(Alex的博客)
原文地址:http://www.cnblogs.com/alex3714/articles/7550940.html 编码回顾 在备编码相关的课件时,在知乎上看到一段关于Python编码的回答 这哥们 ...
随机推荐
- g++编译器的使用(转载)
关于g++ g++ 是GNU组织开发出的编译器软件集合(GCC)下的一个C++编译器.它是Unix 和 Linux 系统下标配的 基于命令行的 C++编译器.如果你的系统是Windows,可以按照 ...
- python——用递归的方法求x的y次幂
def function(x,y): : : )*x ): number = int(input('请输入x的值:')) y = int(input('请输入y的值:')) print('x的y次幂的 ...
- S变换
哈哈,这两天在整理时频分析的方法,大部分参考网上写的比较好的资料,浅显易懂,在这谢过各位大神了! 今天准备写下S变换,由于网上资料较少,自己尝试总结下,学的不好,望各位多多指导 由前面的文章可知,傅里 ...
- 【Set Matrix Zeros】cpp
题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. cl ...
- [oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库
1 form表单如何生成多选框(包含了多选框可选择内容) - Form设置班级输入框为 select多选 - 多选 class TeacherForm(Form): name = fields.Cha ...
- 2018CCPC网络赛
A - Buy and Resell HDU - 6438 The Power Cube is used as a stash of Exotic Power. There are nn cities ...
- 团队Alpha版本冲刺(一)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- 欧拉回路基础 HDU1878 欧拉回路||并差集
欢迎参加——每周六晚的BestCoder(有米!) 欧拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- .Net MVC删除图片
还在学校,菜鸟级别,接触到的只是 /// <summary> /// 根据imageID删除图片 /// </summary> /// <returns>< ...
- 浅谈后缀自动机SAM
一下是蒟蒻的个人想法,并不很严谨,仅供参考,如有缺误,敬请提出 参考资料: 陈立杰原版课件 litble 某大神 某大神 其实课件讲得最详实了 有限状态自动机 我们要学后缀自动机,我们先来了解一下自动 ...