解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

今天准备将某SQLite数据库的内容导出到文本文档(*.txt)中,设计的Python程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- 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()
时间: 2024-10-24 02:21:18

解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误的相关文章

解决Python2.7的UnicodeEncodeError: &#39;ascii&#39; codec can’t encode异常错误

import sys reload(sys) sys.setdefaultencoding('utf-8') 好了,通过上面短短的三行,我们算是很好的解决了这个问题了,同样的方式也可以应用到UnicodeDecodeError上.当然这个技巧来自于网络,我还找到其他特别的办法,但是感觉还是这个比较靠谱,有童鞋说:我们将Python 2.x系列升级到Python 3.x系列就可以了,小小的问题犯不着升级吧,毕竟2到3还是要有个过渡的. 解决Python2.7的UnicodeEncodeError:

UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode character...的解决方法

在python2.7下,因为想从数据库中读出来分类名进行写入到文件,提示 Traceback (most recent call last): File "test.py", line 28, in <module> fp.write("%d:%s\r\n"%(sClassid,sClassName)) UnicodeEncodeError: 'ascii' codec can't encode character u'\uff08' in positi

pip install 安装出现问题:UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position XX的解决办法

pip install 安装出现问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position XX的解决办法 转自csdn 我在cmd中运行: pip install wheel时出现如下的问题 :  解决办法如下: **在Python目录 Python27\Lib\site-packages 建一个文件sitecustomize.py 里面的内容是:** import sys sys.setdefaultenc

解决UnicodeEncodeError: ‘ascii‘ codec can‘t encode问题

今天把一个列表转换成字符串输出的时候出现了 UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128) 解决方法1: 在开头加上 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) 解决方法2: 使用cmd运行python程序,能正常显示结果 另外:1. 当字符串里有 \n.\t.

UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 32-34: ordinal not in range(128) 解决

今天把一个列表转换成字符串输出的时候出现了UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)问题,使用的是ulipad编译器. 解决方法1: 在开头加上 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) 解决方法2: 使用cmd运行python程序,能正常显示结果 Uni

UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 解决方法

今天把一个列表转换成字符串输出的时候出现了UnicodeEncodeError: 'ascii' codec can't encode characters in position : ordinal not in range(128)问题. 解决方法1: 在开头加上 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) 完美解决. UnicodeEncodeError: 'ascii' codec can't encode

python 中UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 0-7: ordinal not in range(128)的解决方法

SyntaxError: Non-ASCII character '\xe6' in file出现这个问题是因为中文出现在了代码中,解决方法为在代码最上面添加:#coding:utf-8 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128) 这个问题则是在程序中写入中文时出错,解决方法为在开头添加: import sys reload(sys) sy

解决UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 6-16: ordinal not in range(128)问题

在开头加上 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) Python自然调用ascii编码解码程序去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128)).所以解决方法就是修改默认编码,需要注意的是需要先调用reload方法. 有时Jenkins执行会报错,而Python执行时不报错,也是在开头加上 import sys reload(sys) sys.setd

Python3中出现UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in ordinal not in range(128)的解决方法

添加代码 import sys import codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) Python3中出现UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)的解决方法 原文地址:https://www.cnblogs.com/liangxc/p/10228027.html