插入数据库时,总是空,我做了如何操作,就好了。数据是采集过来的,程序是gbk编码person_sql="insert into analyst(education_id,alys_name,alys_sex,alys_img,alys_inte,person_id,alys_ctime,org_id) select * from (select (select education_id from education where education_name='"+personInfo[6].decode('gbk').encode('utf-8')+"'),'"+personInfo[1][0]+"','"+personInfo[2][0]+"','"+img+"','"+chenxin+"',convert('"+person_id+"' using gbk) as person_id,now(),(select org_id from organ where inst_code='"+inst_code+"' limit 1) org_id ) t where t.person_id not in(select person_id from analyst b where b.person_id=t.person_id);/n";(转)解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 108: ordinal not in range(128)

python 2011-03-25 11:31:05 阅读21 评论0字号:大中小

混淆了 python2 里边的 str 和 unicode 数据类型。

0.

你需要的是让编码用实际编码而不是 ascii

1.

对需要 str->unicode 的代码,可以在前边写上

import sys

reload(sys)

sys.setdefaultencoding('utf8')

把 str 编码由 ascii 改为 utf8 (或 gb18030)

2.

python3 区分了 unicode str 和 byte arrary,并且默认编码不再是 ascii1.在Python中使用中文在Python中有两种默认的字符串:str和unicode。在Python中一定要注意区分“Unicode字符串”和“unicode对象”的区别。后面所有的“unicode字符串”指的都是python里的“unicode对象”。事实上在Python中并没有“Unicode字符串”这样的东西,只有“unicode”对象。一个传统意义上的unicode字符串完全可以用str对象表示。只是这时候它仅仅是一个字节流,除非解码为unicode对象,没有任何实际的意义。我们用“哈哈”在多个平台上测试,其中“哈”对应的不同编码是:1.UNICODE (UTF8-16),      C854;2.UTF-8,                    E59388;3.GBK,               B9FE。1.1Windows控制台下面是在windows控制台的运行结果:可以看出在控制台,中文字符的编码是GBK而不是UTF-16。将字符串s(GBK编码)使用decode进行解码后,可以得到同等的unicode对象。注意:可以在控制台打印ss并不代表它可以直接被序列化,比如:向文件直接输出ss会抛出同样的异常。在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其它编码输出。这一点对各个环境都一样。总结:在Python中,“str”对象就是一个字节数组,至于里面的内容是不是一个合法的字符串,以及这个字符串采用什么编码(gbk, utf-8, unicode)都不重要。这些内容需要用户自己记录和判断。这些的限制也同样适用于“unicode”对象。要记住“unicode”对象中的内容可绝对不一定就是合法的unicode字符串,我们很快就会看到这种情况。总结:在windows的控制台上,支持gbk编码的str对象和unicode编码的unicode对象。1.2Windows IDLE(在Shell上运行)在windows下的IDLE中,运行效果和windows控制台不完全一致:可以看出,对于不使用“u”作标识的字符串,IDLE把其中的中文字符进行GBK编码。但是对于使用“u”的unicode字符串,IDLE居然一样是用了GBK编码,不同的是,这时候每一个字符都是unicode(对象)字符!!此时len(ss) = 4。这样产生了一个神奇的问题,现在的ss无法在IDLE中正常显示。而且我也没有办法把ss转换成正常的编码!比如采用下面的方法:这有可能是因为IDLE本地化做得不够好,对中文的支持有问题。建议在IDLE的SHELL中,不要使用u“中文”这种方式,因为这样得到的并不是你想要的东西。这同时说明IDLE的Shell支持两种格式的中文字符串:GBK编码的“str”对象,和UNICODE编码的unicode对象。1.3在IDLE上运行代码在IDLE的SHELL上运行文件,得到的又是不同的结果。文件的内容是:直接运行的结果是:毫无瑕疵,相当令人满意。我没有试过其它编码的文件是否能正常运行,但想来应该是不错的。同样的代码在windows的控制台试演过,也没有任何问题。1.4Windows Eclipse在Eclipse中处理中文更加困难,因为在Eclipse中,编写代码和运行代码属于不同的窗口,而且他们可以有不同的默认编码。对于如下代码:#!/usr/bin/python# -*- coding: utf-8 -*-s ="哈哈"ss = u'哈哈'printrepr(s)printrepr(ss)prints.decode('utf-8').encode('gbk')printss.encode('gbk')prints.decode('utf-8')printss前四个print运行正常,最后两个print都会抛出异常:'/xe5/x93/x88/xe5/x93/x88'u'/u54c8/u54c8'哈哈哈哈Traceback (most recent call last):File "E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py", line 13, in print s.decode('utf-8')UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)也就是说,GBK编码的str对象可以正常打印,但是不能打印UNICODE编码的unicode对象。在源文件上点击“Run as”“Run”,然后在弹出对话框中选择“Common”:可以看出Eclipse控制台的缺省编码方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,则可以直接打印GBK编码的str对象,比如s。如果把源文件的编码设置成“UTF-8”,把控制台的编码也设置成“UTF-8”,按道理说打印的时候应该没有问题。但是实验表明,在打印UTF-8编码的str对象时,中文的最后一个字符会显示成乱码,无法正常阅读。不过我已经很满足了,至少人家没有抛异常不是:)BTW: 使用的Eclipse版本是3.2.1。1.5从文件读取中文在window下面用记事本编辑文件的时候,如果保存为UNICODE或UTF-8,分别会在文件的开头加上两个字节“/xFF/xFE”和三个字节“/xEF/xBB/xBF”。在读取的时候就可能会遇到问题,但是不同的环境对这几个多于字符的处理也不一样。以windows下的控制台为例,用记事本保存三个不同版本的“哈哈”。

打开utf-8格式的文件并读取utf-8字符串后,解码变成unicode对象。但是会把附加的三个字符同样进行转换,变成一个unicode字符,字符的数据值为“/xFF/xFE”。这个字符不能被打印。编码的时候需要跳过这个字符。打开unicode格式的文件后,得到的字符串正确。这时候适用utf-16解码,能得到正确的unicdoe对象,可以直接使用。多余的那个填充字符在进行转换时会被过滤掉。打开ansi格式的文件后,没有填充字符,可以直接使用。结论:读写使用python生成的文件没有任何问题,但是在处理由notepad生成的文本文件时,如果该文件可能是非ansi编码,需要考虑如何处理填充字符。1.6在数据库中使用中文刚刚接触Python,我用的数据库是mysql。在执行插入、查找等操作时,如果运行环境使用的字符编码和mysql不一致,就可能导致运行时的错误。当然,和上面看到的情况一样,运行环境并不是关键因素,关键是查询语句的编码方式。如果在每次执行查询操作时都把查询字符串做一次编码转换,转变成mysql的默认字符编码,一样不会遇到问题。但是这样写代码也太痛苦了吧。使用如下代码连接数据库:self.conn = MySQLdb.connect(use_unicode =1, charset='utf8', **server)我不能理解的是既然数据库用的默认编码是UTF-8,我连接的时候也用的是UTF-8,为什么查询得到的文本内容却是UNICODE编码(unicode对象)?这是MySQLdb库的设置么?1.7在XML中使用中文使用xml.dom.minidom和MySQLdb类似,对生成的dom对象调用toxml方法得到的是unicode对象。如果希望输出utf-8文本,有两种方法:1.使用系统函数在输出xml文档的时候进行编码,这是我觉得最好的方法。xmldoc.toxml(encoding=’utf-8’)xmldoc.writexml(outfile, encoding = ‘utf-8’)2.自己编码生成在使用toxml之后可以调用encode方法对文档进行编码。但这种方法无法得到合适的xml declaration(xml文档第一行中的encoding部分)。不要尝试通过xmldoc.createProcessingInstruction来创建一个processing instraction:<?xml version=’1.0’ encoding=’utf-8’?>xml declaration虽然看起来像是,但是事实上并不是一个processing instraction。可以通下面的方法得到一个满意的xml文件:print >> outfile, “<?xml version=’1.0’ encoding=’utf-8’?>”

print >> outfile, xmldoc.toxml().encode(‘utf-8’)[22:]

其中第二行需要过滤掉在调用xmldoc.toxml时生成的“<?xml version=’1.0’ ?>”,它的长度是22。相面是两种方法的用法比较:另外,在IDLE的shell中,不要用 u’中文’ 对属性进行赋值。上面讨论过,这样得到的unicode字符串不正确。

python咖啡名称提取_(转)Python中文全攻略相关推荐

  1. Python中文全攻略 中文乱码 输出中文乱码

    Python中文全攻略   作者:tamsyn  来源:www.sqlite.com.cn  时间:2007-4-25  [ 字体:大 中 小 ] [ 双击滚屏 ]       插入数据库时,总是空, ...

  2. 设计师电脑推荐笔记本_笔记本电脑选购推荐全攻略

    笔记本电脑现如今在我们的生活中出镜率如此之高,不论是学生党查阅资料还是上班族的忙碌办公,抑或是电竞爱好者的游戏体验,都要依靠笔记本电脑来完成,但对于它的选购方法你了解多少?一千个人就有一千种不同的标准 ...

  3. python爬虫数据提取_入门Python爬虫——提取数据篇

    原标题:入门Python爬虫--提取数据篇 作者: 李菲 来源:人工智能学习圈 前言 在提取数据这一环节,爬虫程序会将我们所需要的数据提取出来.在上一篇文章<入门Python爬虫 -- 解析数据 ...

  4. python行星名称输出_用python绘制行星轨道

    我已经写了'r'(Radius)值的一般轨道方程的代码,并试图绘制x=r*cos(theta)和{}的图形,但是我的代码给出了相同的"x"值来表示不同值的"r" ...

  5. Python中文全攻略

    From: http://www.sqlite.com.cn/MySqlite/11/395.Html 1.        在Python中使用中文 在Python中有两种默认的字符串:str和uni ...

  6. python怎么转中文_Python中文全攻略【转】

    这几天一直纠结月python的中文编码问题,发现一篇不错的文章,转过来留个念想. 1.在Python中使用中文 在Python中有两种默认的字符串:str和unicode.在Python中一定要注意区 ...

  7. python识别魔方色块_解魔方的机器人攻略23 – 识别颜色(上)

    今天看到架子上的萝卜头,已经落了很多灰尘.想起萝卜头的攻略还剩几篇迟迟没有写完.前一段时间一直在试验小爱的手机遥控器功能,从今天开始准备陆续把萝卜头的攻略补完,给博客也打扫打扫灰尘. 说起来真是很惭愧 ...

  8. Python 列表与元组(史上最全攻略)

    Python 列表 列表(list)作为 Python 中最常用的数据类型之一,是一个可增加.删除元素的可变(mutable)容器. 列表的所有元素放在一对中括号"[]"中,并使用 ...

  9. Python五大主要用途+零基础基础入门全攻略

    Python可以做什么? Python的热度毋庸置疑,现在国内,不仅考国家二级计算机证需要学习Python,它甚至出现在了小学生的教材里. 那么高度如此高涨的Python,都可以用来做什么呢? 目前来 ...

最新文章

  1. Json在Java后台的操作
  2. 计算机控制实验教程,新)《计算机控制技术》实验教程.doc
  3. SMARTFORM 循环打印实现 (循环调用SMARTFORM)
  4. 漏洞复现|Microsoft Office数学公式编辑器内存损坏漏洞(CVE-2017-11882 )
  5. 【UE4_蓝图】录制麦克风声音/系统声音并输出保存WAV文件
  6. 图片文件怎么快速压缩?
  7. openStack开源云repo db local or on-line 实战部署之Ruiy王者归来
  8. Why ASMLIB and why not?
  9. 达叔走了,别只发声感叹就完了
  10. 复现 ASPCMS企业建站系统Cookies欺骗漏洞
  11. directadmin支持多php,DirectAdmin升级PHP版本
  12. 会员注册与验证码demo 带注释(html、css、js)
  13. android CheckBoxPreference title,summy字体大小设置
  14. 带你认识 flask 国际化和本地化
  15. 生物信息学 第一课 什么是生物信息学
  16. 1228--八目鳗烧烤店
  17. Java在线电影管理系统_09-JAVASE项目实战-电影管理系统
  18. [华为]华为无线控制器AC6508简单配置实例
  19. 华为路由交换由浅入深系列(四)OSPF单区域、多区域配置、时间参数 DRBDR选举 重分布路由与认证演示
  20. Flash cs3组件皮肤

热门文章

  1. ReentrantLock 的实现原理
  2. 初步认识Volatile-CPU层面的内存屏障
  3. 多线程对于共享变量访问带来的安全性问题
  4. 缓存-SpringCache-自定义缓存配置
  5. 数据类型转换_强制转换
  6. 设置eclipse新建maven项目默认使用jdk1.8
  7. SpringBoot 处理内置对象
  8. c语言怎么让两个函数同时进行_Excel高级筛选怎么用同时满足多个条件进行筛选...
  9. cv岗工作做什么_中字头施工单位的党建岗是做什么的?
  10. GitLab初次安装后,登录GitLab网页的管理员账号和密码各是什么?