3

因此,我正在遍历多个大型 xml 文件并生成 MySQL 插入语句以将出租物业列表添加到数据库中。问题是,许多元素包含特殊字符,如 Å 或 ç 甚至一些破折号和项目符号。

我可以很好地获取元素,并且可以创建一个字符串来保存插入语句,但是一旦我尝试执行该语句,我就会被转储到下一个文件中。

我在自己的 try 块中插入了插入,我认为这只会让我继续下一个清单,而不是废弃 xml 文档的其余部分,但这并没有发生。

我已经尝试确保插入是 utf-8 编码的,但这并没有什么不同。

这是我得到的代码的要点:

try:
    print "About to read file: "+fullpath
    data = f.read()  #read the file into a string
    print "Data read from file, now closing: "+fullpath
    f.close()  #close the file, we don't need it any more
    dom = minidom.parseString(data)  #parse the xml
    #get the first child node -- <property_data>
    property_data = dom.firstChild
    properties = property_data.getElementsByTagName('property')
    for property in properties:
        try:
            print "getting details"
            details = property.getElementsByTagName('property_details')
            for detail in details:
                print "attempting to get detail values"
                try:
                     checkin = getElementValue('check_in', detail)
                     name = stripCDATA(getElementValue('name', detail))
                     checkout = getElementValue('check_out', detail)

                                ...etc, etc...

                      print "building insert string"
                      sql = u"""insert into PROPERTY(NAME, CHECKIN, CHECKOUT, etc...)
                                  values(%s,%s,%s,...)""".encode('utf-8')
                      print "starting insert with query:"
                      print sql % (name,checkin,checkout, etc...)
                      try: #HERE IS WHERE THE PROBLEM HAPPENS
                          cursor.execute(sql,(name, checkin, checkout, ...))
                          #display number of rows affected
                          print "Number of rows inserted: %d" % cursor.rowcount
                          conn.commit()
                      except Exception as (errno, strerror):
                          print "Problem inserting the property. Error({0}): {1}".format(errno, strerror)
                except Exception as (errno, strerror):
                    print "Problem with reading/inserting details. Error({0}): {1}".format(errno, strerror)
        except Exception as (errno, strerror):
            print "The loop broke with the following error({0}): {1}".format(errno, strerror)
            errCount += 1
            print "This has happened %d times" % (errCount)
except: #HERE IS WHERE I GET DUMPED TO
    print "Something bad happened while reading and inserting"

正如你所看到的,我在不同的点打印了线条,所以我可以看到事情何时发生。

我知道它正确地解析了文件,我知道它正确地获取了我的所有元素,我知道它正确地构建了插入语句,并且只要我在我抓取的任何元素中的任何地方都命中了一个没有特殊字符的属性,我就知道它是正确插入数据库。只要它击中一个特殊角色,它就会崩溃,当它打破时,它会把我甩出比它应该的高 3 级。到目前为止,大喊大叫和拔头发是无效的。

有任何想法吗?

根据@deadly 的建议,我删除了所有 try...except 块并得到以下回溯:

回溯(最近一次通话最后):

文件“dbinsert2.py”,第 118 行,在 cursor.execute(sql,([bunch of var names]))

文件“/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py”,第 159 行,在执行 query = query % db.literal(args)

文件“/usr/lib/python2.7/dist-packages/MySQLdb/connections.py”,第 264 行,字面返回 self.escape(o, self.encoders)

文件“/usr/lib/python2.7/dist-packages/MySQLdb/connections.py”,第 202 行,在 unicode_literal 返回 db.literal(u.encode(unicode_literal.charset))

UnicodeEncodeError:“latin-1”编解码器无法在位置 20 编码字符 u'\u2013':序数不在范围内(256)

4

1 回答 1

2

没有多少人会耐心地完成所有这些代码。

从摆脱每一次尝试开始......除了。没有它,Python 仍然会愉快地引发异常。

您只需要使用 try... 除非您想对除错误发现之外的异常进行一些特殊处理。在这个阶段打印报表是更好的朋友。此外,如果您放弃 try...excepts(至少是您使用它们的方式),Python 还将打印回溯,您也应该将其与代码一起发布。

整理好代码后,请发布此回溯。

编辑:感谢您的回溯。现在我们可以看到您使用的编码 (utf-8) 与 MySQLdb Python 库使用的默认编码 (latin-1) 之间存在不匹配。您需要charset='utf8'作为参数传递给connect(). ('utf8' 中没有破折号,因为这是 MySQL 存储其字符集列表的方式。)

于 2012-06-07T22:07:49.097 回答