【问题标题】:Python encoding error when turning MySQL query to XML将 MySQL 查询转换为 XML 时出现 Python 编码错误
【发布时间】:2012-05-25 13:12:14
【问题描述】:

我使用此脚本生成必须采用某种格式的自定义 XML 文件。它查询数据库并将结果转换为一个大的 xml 文件。我对从库存零件清单到员工记录的多个数据库执行此操作。

import csv
import StringIO
import time
import MySQLdb
import lxml.etree
import lxml.builder
from datetime import datetime
import string
from lxml import etree
from lxml.builder import E as buildE
from datetime import datetime
from time import sleep
import shutil
import glob
import os
import logging

def logWrite(message):
    logging.basicConfig(
        filename="C:\\logs\\XMLSyncOut.log",
        level=logging.DEBUG,
        format='%(asctime)s %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S: %p'
    )
    logging.debug(message)


def buildTag(tag,parent=None,content=None):
        element = buildE(tag)
        if content is not None:
                element.text = unicode(content)
        if parent is not None:
                parent.append(element)
        return element

def fetchXML(cursor):
        logWrite("constructing XML from cursor")
        fields = [x[0] for x in cursor.description]
        doc = buildTag('DATA')
        for record in cursor.fetchall():
                r = buildTag('ROW',parent=doc)
                for (k,v) in zip(fields,record):
                        buildTag(k,content=v,parent=r)
        return doc

def updateDatabase 1():
        try:
                conn = MySQLdb.connect(host = 'host',user = 'user',passwd = 'passwd',db = 'database')
                cursor = conn.cursor()

        except:
                sys.exit(1)
                logWrite("Cannot connect to database - quitting!")

        cursor.execute("SELECT * FROM database.table")
        logWrite("Dumping fields from database.table into cursor")                
        xmlFile = open("results.xml","w")
        doc = fetchXML(cursor)
        xmlFile.write(etree.tostring(doc,pretty_print=True))
        logWrite("Writing XML results.xml")
        xmlFile.close()

由于某种原因,我从 Excel 电子表格中导入的一个新数据库出现了某种类型的编码错误,而其他数据库则没有。这是错误

element.text = unicode(content)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x96 in position 21: ordinal not in range(128)

我尝试通过将 buildTag 函数更改为如下所示显式编码为 ascii:

def buildTag(tag,parent=None,content=None):
        element = buildE(tag)
        if content is not None:
            content = str(content).encode('ascii','ignore')
            element.text = content
        if parent is not None:
                parent.append(element)
        return element

这还是不行。

有什么想法可以阻止这种情况吗?我无法逃脱它们,因为我不能将“\x92”作为输出显示在记录中。

【问题讨论】:

  • 您应该为 MySQL 设置连接的编码。执行SET NAMES 'UTF8'(或任何适合您的编码)。有关此功能的更多信息,请参阅the manual

标签: python mysql xml encoding lxml


【解决方案1】:

我认为你的 windows 编码有问题,你可以在 shell 中尝试:

In: print '\x92'.decode('cp1251')
Out: '

【讨论】:

    【解决方案2】:

    我专注于

    element.text = unicode(content)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x96 in position 21: ordinal not in range(128)
    

    我假设 content 的类型为 str,即它包含字节码(仅适用于 Python 2)。您必须知道使用哪种编码来生成此字节码。然后,为了从这个字节码创建一个 unicode 对象,你必须明确告诉 Python 如何解码它,例如:

    element.text = content.decode("utf-8")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2016-12-18
      相关资源
      最近更新 更多