UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

从mysql中取出的内容,写入到文本文件(*.html)中,代码如下:

results={'version': u'\u4e2d\u5174'}
with open("H:\Work\\report.html", 'r') as f:
    template = f.read()
    print template
    # tem =template.
content = template.format(**results)
with open("H:\Work\\report.html", 'w+') as f:
    f.write(content)

代码上面应该没有什么问题,Python使用的是版本2.7,但是运行时,出现了异常错误UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128),本来以为数据读取错误,我将template用print打印出来,结果数据全部读取并显示在命令控制台上了,证明代码是没有问题的,仔细看了下异常信息,貌似是因为编码问题:Unicode编码与ASCII编码的不兼容,其实这个Python脚本文件是由utf-8编码的,同时mysql数据库存取的也是UTF-8格式,Python默认环境编码通过下面的方法可以获取:
import sys
print sys.getdefaultencoding()

# 'ascii'


基本上是ascii编码方式,由此Python自然调用ascii编码解码程序去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))。
解决的方案很简单,修改默认的编码模式,很多朋友会想到setdefaultencoding,是的,我们可以通过sys.setdefaultencoding(‘utf-8’)来将当前的字符处理模式修改为utf-8编码模式,值得注意的是,如果单纯这么调用的话,Python会抛出一个AttributeError异常:
Traceback (most recent call last):
 
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'

竟然说sys没有setdefaultencoding的方法,其实sys是有这个方法的,但是要请出她老人家需要调用一次reload(sys),很奇怪,是么?

为什么呢?原因如下:

python在安装时,默认的编码是ascii,那如何获得系统的默认编码:

import sys
print sys.getdefaultencoding()

更改系统的默认编码:

import sys
reload(sys)
sys.setdefaultencoding('UTF-8')

为什么要reload sys模块,先看下python的模块加载过程:

# python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/local/lib/python2.6/site.pyc matches /usr/local/lib/python2.6/site.py
import site # precompiled from /usr/local/lib/python2.6/site.pyc
....

Python运行的时候首先加载了site.py,在site.py文件里有这么一段代码:

if hasattr(sys, "setdefaultencoding"):
    del sys.setdefaultencoding

在sys加载后,setdefaultencoding方法被删除了,解释器里修改的编码只能保证当次有效,在重启解释器后,会发现,编码又被重置为默认的ascii了,那么有没有办法一次性修改程序或系统的默认编码呢。

如果需要在运行时(就是整个解释器启动完之后)进行setdefaultencoding,就只能重新加载sys这个模块。所以我们要通过重新导入sys来设置系统编码.

import sys

reload(sys)
sys.setdefaultencoding('utf-8')
好了,通过上面短短的三行,算是很好的解决了这个问题了,同样的方式也可以应用到UnicodeDecodeError上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web魔法师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值