UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

最近在群里总是遇到有人问这个问题,其实这个错误的本身和代码的编写应该没关系,代码的语法等应该是没有问题的。

原来的代码是这样的

# -*- 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: ‘ascii’ codec can’t encode异常错误_第1张图片

这是由于编码的错误。python本身是有默认的编码,可以通过以下方式获得:

import sys

print sys.getdefaultencoding()

如果你的代码使用的是utf-8编码,但是默认的编码是ascii,那么,这两个就会不兼容,出现以上的错误。


可以通过sys.setdefaultencoding(‘utf-8′)方式来修改python的默认编码。但是在python 2.7环境下,直接这么用就会出现如下AttributeError异常


其实并不是因为sys没有setdefaultencoding()而是在调用之前需要先调用reload(sys):

import sys

reload(sys)

sys.setdefaultencoding('utf-8')


修改的代码如下:

# -*- 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()

本文借鉴博文:http://wangye.org/blog/archives/629/#userconsent#     王晔的流水账





你可能感兴趣的:(Python编程)