从mysql中取出的内容,写入到文本文件(*.html)中,代码如下:
代码上面应该没有什么问题,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()
解决的方案很简单,修改默认的编码模式,很多朋友会想到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('utf-8')
好了,通过上面短短的三行,算是很好的解决了这个问题了,同样的方式也可以应用到UnicodeDecodeError上。
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'
解决的方案很简单,修改默认的编码模式,很多朋友会想到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上。