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

大家都知道,在使用python进行网络爬虫时,最头疼的就是转码问题,下面是我在编写完爬虫代码后,进行往“.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()

末尾补充: 上面是收集自网络的该问题的解决方法,在我使用上面方法后还是爆出:“空的字符无法进行str拼接”,此时,肯定你的xpath取值时有某一个字段是空的,只要在你要取得字段后添加:

# #状态开始日期
items['start_date'] = site.xpath('td[7]/text()')[0] if len(site.xpath('td[7]/text()'))>0 else str('空')
# #任务类型
items['task_genre'] = site.xpath('td[8]/text()')[0] if len(site.xpath('td[8]/text()'))>0 else str('空')

即可完美解决。

解决Python2.7的UnicodeEncodeError:'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)异常错误的更多相关文章

  1. UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ordin al not in range(128)——解决方案备注

    在vim中使用ycm插件时,偶尔会出现: “UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ord ...

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

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) ...

  3. [错误解决]UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

    python2内容无法写入csv,报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordin ...

  4. 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 问题(转)

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range(128 ...

  5. pip install 安装出现问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position XX的解决办法

    pip install 安装出现问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position XX的解决办法 转自c ...

  6. 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(en ...

  7. [转]Python UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法

    UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 的解决办法 python在安装时,默认的编码是ascii,当 ...

  8. 解决UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position

    最近用Python写了些爬虫,在爬取一个gb2312的页面时,抛出异常: UnicodeEncodeError: 'ascii' codec can't encode characters in po ...

  9. python+selenium运行报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

    使用python+selenium运行自动化脚本时,打印某一段文字出现UnicodeEncodeError: 'ascii' codec can't encode characters in posi ...

随机推荐

  1. JSTL常用标签

    JSTL标签常用:http://blog.csdn.net/imust_can/article/details/6965756

  2. 云计算之路-阿里云上:访问阿里云CDN上的图片,自动跳转到百度首页

    昨天有用户向我们反馈一篇博文(一条语句导致CPU持续100%)中的部分图片不能显示,我们的图片访问用的是阿里云CDN,原以为是某个CDN节点不稳定的问题,但在排查时发现这些图片不能显示竟然是因为请求时 ...

  3. 在ZABBIX平台上通过SNMP协议监控网络设备

    在ZABBIX平台上通过SNMP协议监控网络设备 方法一:自动发现监控项 ZABBIX自带模板Template SNMP Interfaces中有"自动发现规则"这一选项,在主机选 ...

  4. tomcat管理界面登录无法进入

    问题: 在打开tomcat界面之后,点击Manger App准备进入管理界面,路径:http://localhost:8080/manager/html. 输入正确的用户名和密码,但是出现401界面. ...

  5. c语言中的内存浅析

    1.栈(stack):存局部变量.函数,调用函数时会开辟栈区,函数结束时就自动回收,遵循后进先出的原则,从高地址向低地址增长. 2.堆(heap):malloc.realloc.calloc等开辟的内 ...

  6. 乐橙谷浅析JAVA程序员就业前景

    不知道大家对Java就业前景了解多少.随着信息化的发展,IT培训受倒了越来越多人的追捧.在开发领域,JAVA培训成为了许多人的首选!JAVA应用广泛,JAVA培训就业前景良好!目前,虽然JAVA人才的 ...

  7. 谈javascript变量声明

    之前的面试中遇到过一道面试题 var a =10;(function(){ console.log(a); var a =20;})() 短短5行代码log的结果是什么? 如果把var a = 20; ...

  8. [js高手之路] html5 canvas系列教程 - 认识canvas以及基本使用方法

    canvas是html5中引入的一个新元素,俗称画布,既然是画布,当然是用来画图的.canvas技术指的是利用javascript操作canvas元素绘制图形的技术,要使用canvas,一定要浏览器支 ...

  9. MySQL之多表操作

    前言:之前已经针对数据库的单表查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对多张表进行操作,现在对多表操作进行介绍. 前提:为方便后面的操作,我们首先创建一个数据库 ...

  10. 怎样让PDM图形列表显示name和code等需要的信息

    1. 工具(TOOLS)-〉显示参数设置(DISPLAY PREFERENCES) 2. 在弹出来的框中选中Content-〉Table 3. 点右下角那个Advanced 按钮 4. 在弹出的框个选 ...