题目:解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
来源:互联网 发布:电脑看片有什么软件 编辑:程序博客网 时间:2024/05/17 03:22
今天准备将某SQLite数据库的内容导出到文本文档(*.txt)中,设计的Python程序如下:
# -*- coding: UTF-8 -*-
import sqlite3
def gsel(cur):
cur.execute("SELECT * FROM collection")
def main():
conn = sqlite3.connect("build.db3")
cur = conn.cursor()
gsel(cur)
# conn.commit()
rs = cur.fetchall()
fp = open("output.txt", "w")
for row in rs:
fp.write(row[1]) # 读取并写入第2列数据
if __name__ == '__main__':
main()
代码上面应该没有什么问题,Python使用的是版本2.7,但是在运行的时候出现了异常错误UnicodeEncodeError:
Traceback (most recent call last):
File "makedb.py", line 33, in
main()
File "makedb.py", line 30, in main
fp.write(row[1])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)
本来以为数据读取错误,我特将fp.write改成print,结果数据全部读取并显示在命令控制台上了,证明代码是没有问题的,仔细看了下异常信息,貌似是因为编码问题:Unicode编码与ASCII编码的不兼容,其实这个Python脚本文件是由utf-8编码的,同时SQlite3数据库存取的也是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),很奇怪,是么?如果有谁知道原因的话,还望不吝赐教。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
好了,通过上面短短的三行,我们算是很好的解决了这个问题了,同样的方式也可以应用到UnicodeDecodeError上。当然这个技巧来自于网络,我还找到其他特别的办法,但是感觉还是这个比较靠谱,有童鞋说:我们将Python 2.x系列升级到Python 3.x系列就可以了,小小的问题犯不着升级吧,毕竟2到3还是要有个过渡的。
最后,我将文章一开始的代码更改如下:
# -*- coding: UTF-8 -*-
import sys # 1
import sqlite3
def gsel(cur):
cur.execute("SELECT * FROM collection")
def main():
reload(sys) # 2
sys.setdefaultencoding('utf-8') # 3
conn = sqlite3.connect("build.db3")
cur = conn.cursor()
gsel(cur)
# conn.commit()
rs = cur.fetchall()
fp = open("output.txt", "w")
for row in rs:
fp.write(row[1])
if __name__ == '__main__':
main()
# -*- coding: UTF-8 -*-
import sqlite3
def gsel(cur):
cur.execute("SELECT * FROM collection")
def main():
conn = sqlite3.connect("build.db3")
cur = conn.cursor()
gsel(cur)
# conn.commit()
rs = cur.fetchall()
fp = open("output.txt", "w")
for row in rs:
fp.write(row[1]) # 读取并写入第2列数据
if __name__ == '__main__':
main()
代码上面应该没有什么问题,Python使用的是版本2.7,但是在运行的时候出现了异常错误UnicodeEncodeError:
Traceback (most recent call last):
File "makedb.py", line 33, in
main()
File "makedb.py", line 30, in main
fp.write(row[1])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)
本来以为数据读取错误,我特将fp.write改成print,结果数据全部读取并显示在命令控制台上了,证明代码是没有问题的,仔细看了下异常信息,貌似是因为编码问题:Unicode编码与ASCII编码的不兼容,其实这个Python脚本文件是由utf-8编码的,同时SQlite3数据库存取的也是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),很奇怪,是么?如果有谁知道原因的话,还望不吝赐教。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
好了,通过上面短短的三行,我们算是很好的解决了这个问题了,同样的方式也可以应用到UnicodeDecodeError上。当然这个技巧来自于网络,我还找到其他特别的办法,但是感觉还是这个比较靠谱,有童鞋说:我们将Python 2.x系列升级到Python 3.x系列就可以了,小小的问题犯不着升级吧,毕竟2到3还是要有个过渡的。
最后,我将文章一开始的代码更改如下:
# -*- coding: UTF-8 -*-
import sys # 1
import sqlite3
def gsel(cur):
cur.execute("SELECT * FROM collection")
def main():
reload(sys) # 2
sys.setdefaultencoding('utf-8') # 3
conn = sqlite3.connect("build.db3")
cur = conn.cursor()
gsel(cur)
# conn.commit()
rs = cur.fetchall()
fp = open("output.txt", "w")
for row in rs:
fp.write(row[1])
if __name__ == '__main__':
main()
阅读全文
0 0
- 题目:解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- 解决Python2.7的UnicodeEncodeError: ‘ascii‘codec can’t encode异常错误
- Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode 错误
- 解决Python2.x的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- Python2.7的UnicodeEncodeError: 'ascii' codec can't encode xxxx
- Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode问题解决
- Python2.x的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- python2.7出现[UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11]的解决
- Sping-Boot 单元测试
- python-对象、私有属性_方法、继承(多重继承)、重写
- WebView的总结
- linux三
- OpenStack大规模部署详解 Ocata
- 题目:解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte
- js 判断数组 对象 为空
- access 学习记录
- 创建第一个Maven项目
- Java之正则表达式的组概念-yellowcong
- leetcode 216. Combination Sum III DFS + 按照index递归遍历
- node 实现城市列表A-Z 排序
- springboot websocket 解决不能注入bean问题