gpt4 book ai didi

python - Python 将 UTF 字符从 XML 插入 MySQL 时出现问题

转载 作者:可可西里 更新时间:2023-11-01 08:36:20 27 4
gpt4 key购买 nike

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

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

我已经在它自己的 try block 中插入了插入内容,我认为这只会让我继续下一个列表而不是废弃 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 block 并得到以下回溯:

Traceback (most recent call last):

File "dbinsert2.py", line 118, in cursor.execute(sql,([bunch of var names]))

File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 159, in execute query = query % db.literal(args)

File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 264, in literal return self.escape(o, self.encoders)

File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 202, in unicode_literal return db.literal(u.encode(unicode_literal.charset))

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 20: ordinal not in range(256)

最佳答案

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

首先摆脱每一次尝试……除了。没有它,Python 仍然会很高兴地引发异常。

你只需要使用 try...except 如果你想对异常做一些超出查找错误的特殊处理。在这个阶段,打印语句是更好的 friend 。此外,如果您不使用 try...excepts(至少您使用它们的方式),Python 还将打印回溯,您也应该将其与您的代码一起发布。

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

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

关于python - Python 将 UTF 字符从 XML 插入 MySQL 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10939917/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com