坑
1、在sublime text执行py文件时,文件名不能包含中文
2、之前sublime text不支持中文,后来发现是缺少声明
# -*- coding: UTF-8 -*-
3、postgresql外部导入excel数据时,不需要带列名,否则会导致格式错误
4、sublime text编译出现[Decode error – output not utf-8],解决方案
解决方法:
1、preferences-browse packages-python-python.sublime-build
2、添加"encoding":"cp936"
原因:
python在编译运行源码后,默认将输出结果以cp936编码,发送给Sublime Text。而Sublime Text 中python build的默认接收编码是UTF-8。Sublime Text在接收到python输出后,试图以utf-8解码cp936编码的流。当cp936编码的流中没有汉字时,因为英文字符集在cp936和utf-8中的编码兼容,所以用utf-8解码不会出错;当cp936编码的流中有汉字时,因为汉字字符集在cp936与utf-8的编码不兼容,所以用utf-8解码就会错误。
最终Sublime Text就会报[Decode error - output not utf-8]错误
后续:
当运行如下脚本时:
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import json
mytree={"纹理": {"模糊": "否", "清晰": {"根蒂": {"稍蜷": {"色泽": {"乌黑": {"触感": {"软粘": "否", "硬滑": "是"}}, "青绿": "是"}}, "蜷缩": "是", "硬挺": "否"}}, "稍糊": {"触感": {"软粘": "是", "硬滑": "否"}}}}
print json.dumps(mytree,ensure_ascii=False)
因为已经重新设置了python编码为utf-8,并将结果以utf-8形式发给sublime text,所以不需要对sublime的默认编码改动
你没弄懂的是,Python 在 print 列表和字典等数据结构时,输出的是数据的内部存储格式,也就是说如果里面的元素是中文字符串,Python 不会把中文直接打印出来,而是会把中文的编码打印出来。
例如:
print ['中', '文']
['\xe4\xb8\xad', '\xe6\x96\x87']
相当于每个元素打印的是 repr 的结果:
print repr('中')
'\xe4\xb8\xad'
而如果直接打印其中的元素是能显示中文的:
print ['中', '文'][0]
中
因此如果你想能显示出中文,不应该直接去 print 整个数据结构 object,应该将其转为相应格式的字符串后再 print。
例如其中一种方法是:
s = repr(['中', '文']).decode('string-escape')
print s
['中', '文']
如果元素是 unicode:
s = repr([u'中', u'文']).decode('unicode-escape')
print s
而如果是 json 数据,更好的方法是用楼上说的方法:
print(json.dumps({u"语言": u"中文"}, ensure_ascii=False))
{"语言": "中文"}
简单说来就是,python内部表示字符串用unicode(其实python内部的表示和真实的unicode是有点差别的,对我们几乎透明,可不考虑),和人交互的时候用str对象。
s.decode ——–>将s解码成unicode,参数指定的是s本来的编码方式。这个和unicode(s,encodename)是一样的。
u.encode ——–>将unicode编码成str对象,参数指定使用的编码方式。
助记:decode to unicode from parameter
encode to parameter from unicode
只有decode方法和unicode构造函数可以得到unicode对象。
上述最常见的用途是比如这样的场景,我们在python源文件中指定使用编码cp936,
coding=cp936或#-- coding:cp936 --或#coding:cp936的方式(不写默认是ascii编码)
这样在源文件中的str对象就是cp936编码的,我们要把这个字符串传给一个需要保存成其他编码的地方(比如xml的utf-8,excel需要的utf-16)
通常这么写:
strobj.decode(“cp936”).encode(“utf-16”)