• 【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-uD7FFu0009u000Au000DuE000-uFFFDu10000-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'}
  • 相关阅读:
    1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组
    数论笔记
    Codevs 1200 同余方程 2012年NOIP全国联赛提高组
    Codevs 1213 解的个数(exgcd)
    Qbxt 模拟赛&&day-8
    NOIP 模拟赛 那些年,我们学过的文化课 --致已退役的fqk神犇.
    OI路上 day -9
    P3178 [HAOI2015]树上操作
    P3979 遥远的国度
    P4092 [HEOI2016/TJOI2016]树
  • 原文地址:https://www.cnblogs.com/dplearning/p/5780071.html
Copyright © 2020-2023  润新知