【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'}

 

posted @ 2016-08-17 15:01  匡子语  阅读(439)  评论(0编辑  收藏  举报