0

このスクリプトを使用して、特定の形式である必要があるカスタムXMLファイルを生成します。データベースにクエリを実行し、結果を1つの大きな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スプレッドシートからインポートした新しいデータベースの1つに、他のデータベースにはないタイプのエンコードエラーがあります。これはエラーです

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」を出力としてレコードに表示させることができないため、それらをエスケープすることはできません。

4

2 に答える 2

0

私は焦点を当てています

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

私はそれcontentがタイプであると仮定してstrいます、すなわちそれはバイトコードを含んでいます(Python2にのみ当てはまります)。このバイトコードを生成するためにどのエンコーディングが使用されているかを知る必要があります。次に、このバイトコードからUnicodeオブジェクトを作成するには、次のように、Pythonにデコード方法を明示的に指示する必要があります。

element.text = content.decode("utf-8")
于 2012-05-25T14:33:51.497 に答える
0

シェルで試すことができるWindowsエンコーディングに問題があると思います:

In: print '\x92'.decode('cp1251')
Out: '
于 2012-05-25T14:03:13.480 に答える