因此,我正在遍历多个大型 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)