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

今天准备将某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()

# -*- 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'

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 "", line 1, in

AttributeError: 'module' object has no attribute 'setdefaultencoding'

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'setdefaultencoding'

竟然说sys没有setdefaultencoding的方法,其实sys是有这个方法的,但是要请出她老人家需要调用一次reload(sys),很奇怪,是么?如果有谁知道原因的话,还望不吝赐教。

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

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 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UnicodeEncodeError: 'gbk'编解码器无法在位置7135处编码字符'\xa9',这是一个非法的多字节序列错误。这个错误通常发生在尝试将包含非ASCII字符的字符串编码成GBK格式时。解决方案包括: 1. 使用更适合处理非ASCII字符的编解码器,如UTF-8。在代码中将编解码器更改为'utf-8'或'utf8'。 2. 使用decode()函数将字符串从GBK解码为Unicode,而不是尝试进行编码。 3. 对于输出,可以使用try-except语句捕获这个错误,并找到合适的方式处理这个字符。 4. 如果使用的是IDE或编辑器,可以尝试更改编辑器的字符编码设置,使其与代码中使用的编码一致。 请注意,上述解决方案只是一般性建议,具体解决方法可能因代码的上下文和具体问题而有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\xa0‘ in position 21: illegal multibyte...](https://blog.csdn.net/qq_59544594/article/details/127222466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [报错 UnicodeEncodeError: gbk codec cant encode character \xa9 in position 3738: illegal multibyt](https://blog.csdn.net/weixin_47293194/article/details/106227307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值