刚遇到这个问题的时候,在网上找了 半天,发现都是说 添加如下三行代码即可解决问题,

[python]

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

但是我加了之后还解决不了,经过一番思考和挖掘终于找到本质原因,

我是在小小说下载器练手的时候遇到的问题,在将爬下来的小说内容写入都文件时报的错,由于其中一些内容,ascii编码不支持,所以报错。

所以,更好的办法是,在输出的时候,对文件制定特定的UTF-8编码即可。而无需改动默认编码。

[python]

#不使用open打开文件,而使用codecs:

fp = codecs.open(‘output.txt’, ‘a+’, ‘utf-8′);;

fp.write(row[1]);

fp.close();

#不使用open打开文件,而使用codecs:

fp = codecs.open(‘output.txt’, ‘a+’, ‘utf-8′);;

fp.write(row[1]);

fp.close();

下面是我转载的一篇关于codecs的文章

----------------------------------------------------------分割线-------------------------------------------------------------

字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。



Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。



使用“import codecs”导入codecs模块。



codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等等。如下示例:

>>> import codecs

>>> t = codecs.lookup("utf-8")

>>> print t

(<built-in function utf_8_encode>, <function decode at 0x00AA25B0>, <class encodings.utf_8.StreamReader at 0x00AA0720>, <class encodings.utf_8.StreamWriter at 0x00AA06F0>)

>>> encoder = t[0]

>>> decoder = t[1]

>>> StreamReader = t[2]

>>> StreamWriter = t[3]

lookup函数返回一个包含四个元素的TUPLE,其中t[0]是encoder的函数引用,t[1]是decoder的函数引用,t[2] 是UTF-8编码方式的StreamReader类对象引用,t[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉的你肯定知道接下来该怎么用它们了。



codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:

getencoder(encoding)

getdecoder(encoding)

getreader(encoding)

getwriter(encoding)

如果我们只是想获取一种utf-8编码的encoder方法,那么只需要这样做:

>>> encoder = codecs.getencoder("utf-8")



另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即可。使用方法如下:

>>> fin = codecs.open("e:\\mycomputer.txt", "r", "utf-8")

>>> print fin.readline()

这是我的电脑

>>> fin.close()



总结一下,codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和
StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对 encoder和decoder的双向服务。

最新文章

  1. Sql Server 2008完全卸载方法(其他版本类似)
  2. 利用WiFi钓鱼法追邻居漂亮妹纸
  3. Liferay SDK 6.2与7.0中build.[$username].properties 文件的配置
  4. OpenGL开发时,fatal error C1083: 无法打开包括文件:“gl\glut.h”: No such file or directory
  5. (iOS)viewController背景透明化
  6. aStar算法求第k短路
  7. 解决iOS手势冲突问题
  8. SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器
  9. 使用VirtualBox把IMG文件转换为VDI文件
  10. Appium Python API 中文版
  11. 常用验证正则:用户名、密码、邮箱、手机号、身份证(PHP和JavaScript)
  12. springboot和mybatis之thymleaf整合简单插入用户数据
  13. zookeepeer4字命令实践
  14. openwrt 添加 802.1x客户端njit
  15. SVN创建分支主干策略
  16. 用python生成器实现杨辉三角
  17. 7.3 5种IO模型与IO复用
  18. 解题:POI 2010 Beads
  19. https填坑之旅
  20. [转]SSIS cannot convert between unicode and non-unicode string

热门文章

  1. 剑指架构师系列-MySQL常用SQL语句
  2. 代理delegate
  3. Docker镜像的实现原理
  4. Jmeter(十七)_驱动浏览器做GUI测试
  5. 编写高性能的Lua代码
  6. Spark编译及spark开发环境搭建
  7. RxJava(10-操作符原理&amp;自定义操作符)
  8. Android图表库MPAndroidChart(七)—饼状图可以再简单一点
  9. C语言与java语言中数据类型的差别总结
  10. 【移动开发】AIDL中callback的实现