Python编码爬坑指南(必看)


Posted in Python onJune 10, 2016

自己最近有在学习python,这实在是一门非常短小精悍的语言,很喜欢这种语言精悍背后又有强大函数库支撑的语言。可是刚接触不久就遇到了让人头疼的关于编码的问题,在网上查了很多资料现在在这里做一番总结,权当一个记录也为后来的兄弟姐妹们服务,如果可以让您少走一些弯路本人将倍感荣幸。

先来描述下现象吧:

import os
for i in os.listdir("E:\Torchlight II"):
  print i

代码很简单我们使用os的listdir函数遍历了E:\Torchlight II这个目录(Torchlight ?! :)),由于这个目录下有些文件是以中文命名的,所以在最后print结果时出现了乱码,像这样:

Python编码爬坑指南(必看)

那么问题出在哪儿呢? 别急,我们一点一点来分析它。

这里这里我们几乎能够肯定的知道问题是出在:

This means that the python console app can't write the given character to the console's encoding.
More specifically, the python console app created a _io.TextIOWrapperd instance with an encoding that cannot represent the given character.
sys.stdout --> _io.TextIOWrapperd --> (your console)

看到这里不知你是否与我想的一样,能不能去设置console的编码,将其设置为能够理解中文字符的编码不就可以正常的显示出中文了吗?等等,让我们在多Google一会儿,

Python determines the encoding of stdout and stderr based on the value of the LC_CTYPE variable, but only if the stdout is a tty. So if I just output to the terminal, LC_CTYPE (or LC_ALL) define the encoding. However, when the output is piped to a file or to a different process, the encoding is not defined, and defaults to 7-bit ASCII.

更详细的说明如下:

1). When Python finds its output attached to a terminal, it sets the sys.stdout.encoding attribute to the terminal's encoding. The print statement's handler will automatically encode unicode arguments into str output.
2). When Python does not detect the desired character set of the output, it sets sys.stdout.encoding to None, and print will invoke the "ascii" codec.

嚯嚯,看来刚才的想法是可行的只是不太优雅罢了,因为我们得去修改系统的设置。事实上上面的论述是基于linux环境的,在linux下可能需要我们去更改某个环境变量的值(LC_CTYPE or LANG);如果我们是在windows下面的话,console的编码设置是跟操作系统的区域设置相关的。比如在中文的win7环境下,console默认的编码就是GBK(cp936)。你可以试试下面的代码:

import locale
print locale.getdefaultlocale()[1]

console的编码不好设置了那能否对stdout.out.encoding进行设置以达到我们的目的呢?很遗憾,答案是否定的,这家伙压根就是只读的:

Python编码爬坑指南(必看)

没有办法了么?不会,其实我们离成功已经很近了,来,根据上面检索到的那些资料分析整理下看看我们现在掌握到的情况都有哪些:

 

1). console不能正常显示中文,console的编码是由操作系统决定的(windows环境下);
 2). 我的操作系统是win7中文版(GBK),enc = locale.getdefaultlocale()[1];
 3). console的编码决定了sys.stdout.encoding的取值,sys.stdout.encoding = utf-8;
 4). 从操作系统枚举目录(E:\Torchlight II)列表返回的字符串也是GBK编码

 是不是已经看出问题来了。最上面截图中那么奇奇怪怪的问号尖角符号就是因为字符串本身是按照gbk进行编码的,但是由于sys.stdout.encoding = utf-8,导致print会按照utf-8对input的数据进行encode从而转换为unicode字符。这,当然错误了。原因已经清楚了,来改改代码吧:

import os
for i in os.listdir("E:\Torchlight II"):
  print i.decode('gbk')

在代码中我们手动告诉了python对读入的字符串按章gbk编码来进行解码,而这一个动作之后数据已经是标准的unicode字符了,可以放心的交给print去打印输出了(即使这会儿sys.stdout.encoding = utf-8):

Python编码爬坑指南(必看)

 ps:

实际在google中还查到过很多相关的类似编码的问题,比如这里的,还有这里的。虽然问题的样子千变万化并且解决方式多种多样甚至是python自己的特定解决方式,比如这里。但这些问题本质都是一样的都是关于字符的编码和解码,搞清楚了其中的本质所有问题都能够迎刃而解。

以上这篇Python编码爬坑指南(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python类中super()和__init__()的区别
Oct 18 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
python多进程并发demo实例解析
Dec 13 Python
Python实现CAN报文转换工具教程
May 05 Python
重写django的model下的objects模型管理器方式
May 15 Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
python 动态绘制爱心的示例
Sep 27 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 Python
浅析Python中的for 循环
Jun 09 #Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 #Python
Python-嵌套列表list的全面解析
Jun 08 #Python
PYTHON压平嵌套列表的简单实现
Jun 08 #Python
Python用Bottle轻量级框架进行Web开发
Jun 08 #Python
浅谈Python数据类型之间的转换
Jun 08 #Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 #Python
You might like
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
Javascript实现字数统计
2015/07/03 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
详细分析vue表单数据的绑定
2020/07/20 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
Python实现句子翻译功能
2017/11/14 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
python如何生成各种随机分布图
2018/08/27 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
十八届三中全会报告学习材料
2014/02/17 职场文书
文明村创建实施方案
2014/03/27 职场文书
教师节标语大全
2014/10/07 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技