【python】mysqlDB转xml中的编码问题

背景:有mysql数据库,将数据从数据库中读取,并存储到xml中

采用了MySQLdb和lxml两个库

具体编码处理过程如下:

1. 指定mysql的编码方式
2.取数据库data->判断data类型(type, isinstance)->| unicode字符->|有特殊控制字符->去除
                                              |             |正常->直接写入                                                                    |
                                              |数字,日期等格式->转为字符串
                                              |其他编码方式字符->decode

1.指定mysql编码方式

按照如下方式指定字符集:来源

db = MySQLdb.connect(..., charset=‘utf8‘)

如果不指定字符集,当默认字符集与实际数据字符集不同时,取出的数据会出现乱码。

2.取出数据后判断数据类型

为何要判断数据类型呢?因为lxml中的数据都要是字符类型的,而数据库中取出的数据有可能是int, long, date之类非数字类型,所以需要判断以便于后续处理

判断方式有两种:type和isinstance

>>> n = 911
>>> type(n)
<type ‘int‘>
>>> type(n) is int
True
a = 111
isinstance(a, int)
True

isinstance要优于type:区别就是 对于subclass之类的 type就不行了 来源

class A:
    pass

class B(A):
    pass

isinstance(A(), A)  # returns True
type(A()) == A      # returns True
isinstance(B(), A)    # returns True
type(B()) == A        # returns False

注意判断时类型就直接写 int, str, unicode就可以,不要引号

3.去除unicode中的特殊字符

来源

unicode中只支持以下字符

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

所以,需要把除上述范围之外的特殊字符都删掉,否则会报错

采用正则

content = re.sub(u‘[^\u0020-\uD7FF\u0009\u000A\u000D\uE000-\uFFFD\u10000-\u10FFFF]+‘, ‘‘, text)

在来源中还有其他的方案,但是正则的速度快

4. 数字等类型转为字符串

直接str(),因为lxml支持ascii和unicode,所以用str直接转为ascii编码就可以

5. 其他编码方式decode

其实前面mysql中指定了编码方式后不应该有其他编码类型的,不过这里也介绍一下处理方法->decode

用decode将字符串解码为标准unicode

‘abc‘.decode(‘utf-8‘)

decode使用时需要给出字符的原本编码方式,如果不确定的话可以用chardet来判断

import chardet

s = "abc"
code_method = chardet.detect(s)
print code_method

输出:

{‘confidence‘: 1.0, ‘encoding‘: ‘ascii‘}
时间: 2024-10-10 16:19:44

【python】mysqlDB转xml中的编码问题的相关文章

web.xml 中以编码方式添加filter并设置初始化参数AbstractAnnotationConfigDispatchServletInitializer

web.xml中配置filter <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

Python 2 中的编码

在 Python 尤其是 Python2 中,编码问题是困扰开发者尤其初学者的一大问题.什么 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人头都大了.其实不然,这有点类似 Java 中 java.io 包一样,看似庞大难懂,但是可以非常精细地定制需求. 编码 计算机只可以存储和处理二进制数据,所以从文字到计算机可以识别的二进制之间需要一道对应关系.于是便有了ASCII(American Standard Code for Information Interch

python中的编码问题:以ascii和unicode为主线

  1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8是unicode的一种实现方式,unicode.gbk.gb2312是编码字符集: 2.python中的中文编码问题 2.1 .py文件中的编码 Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正. 一个mo

python语言中的编码问题

在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的机制,并由此寻求解决问题的根本路径,那么永远不能从码农的阴影中摆脱出来.下面就来一起了解一下计算机编码问题的来龙去脉. ASCII 众所周知,计算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制形式存储的.然而,计算机中的字符,并不能完全以这种

python中的编码与解码

编码与解码 首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示00110101,还是要显示'a',但计算机怎么知道00110101是'a'呢,这就需要解码,当选择用ascii解码时,当计算机读到00110101时就到对应的ascii表里一查发现是'a',就显示为'a' 编码:真实字符与二进制串的对应关系,真实字符→二进制串 解码:二进制串与真实字符的对应关系,二进制

浅谈Python中的编码规则

注:本人用Python3.4作为学习版本,以下学习心得只适用于Python3.4. 之前拜读了金角大王Alex关于编码的解答,收获颇多.特此致谢,以下仅谈一谈作为一个初学者,对编码的理解. 我所了解的编码,大致分为两类:第一类是支持中文的编码集:第二类是支持英文的编码集.至于别国的编码集,暂且不做讨论. 常见编码:ASCII:Unicode:UTF-8:big5,:GB2312:GBK:GB18030 接下来,我对以上编码进行分类: 只支持英文和特殊字符的编码:ASCII ASCII是基于拉丁字

python中字符串编码问题

个人遇到问题: 某个文件1,里面有字符创"360云盘" 用cat看 用less命令查看时如下: 是用vim查看时如下: 显然在vim是能够正确识别的,也就是说这3个命令查看文件时,编码方式是不一样的. 下面用file命令来查看本文件的编码方式如下:file 文件名 编码方式是:ISO-8859 这个是什么编码方式呢?它是中文编码方式,由于file命令不是取全文,而是截取文章前面部分进行一个判断的.ISO-8859-1 到ISO-8859-16,其实,也就认为是GB2312的汉字编码方式

在pom.xml中设置maven工程编码

在pom.xml中添加属性project.build.sourceEncoding就可以设置工程的编码 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> 版权声明:本文为博主原创文章,未经博主允许不得转载.

在web.xml中设置全局编码

在web.xml中配置 <filter> <filter-name>characterFilter</filter-name> <filter-class>com.cn.CharacterFilter</filter-class> </filter> <filter-mapping> <filter-name>characterFilter</filter-name> <url-pattern