Python:编码问题

时间:2011-05-23 14:20:29

标签: python encoding

我想将数据从一个数据库复制到另一个数据库。因此我为此编写了一个Python脚本。

姓名是德语,但我认为这不会成为理解我的问题的问题。

该脚本执行以下操作

db = mysql.connect(db='', charset="utf8", use_unicode=True, **v.MySQLServer[server]);
...
cursor = db.cursor();

cursor.execute('select * from %s.%s where %s = %d;' % (eingangsDatenbankName, tabelle, syncFeldname, v.NEU))
daten = cursor.fetchall()

for zeile in daten:
    sql = 'select * from %s.%s where ' % (hauptdatenbankName, tabelle)
    ...
    for i in xrange(len(spalten)):
        sql += " %s, " % db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])

“db_util.formatierFeld”方法如下所示

def formatierFeld(inhalt, feldTyp):

    if inhalt.lower() == "none":
        return "NULL"    #Stringtypen
    if "char" in feldTyp.lower() or "text" in feldTyp.lower() or "blob" in feldTyp.lower() or "date".lower() in feldTyp.lower() or "time" in feldTyp.lower():
        return '"%s"' % inhalt 
    else:
        return '%s' % inhalt 

嗯,对你们中的一些人来说,这些东西看起来很奇怪,但我可以保证你们必须这样做,所以请不要讨论风格等。

好的,运行此代码时,当我遇到使用变音符号的单词时,会收到以下错误消息。

Traceback (most recent call last):
  File "db_import.py", line 222, in <module>
    main()
  File "db_import.py", line 219, in main
    importieren(server, lokaleMaschine, dbEingang, dbHaupt)
  File "db_import.py", line 145, in importieren
    sql += " %s, " %  db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 1: ordinal not in range(128)

实际上我不明白为什么这个字符串无法以这种方式构建。我认为这应该有效,因为我明确告诉程序在这里使用unicode。

有人猜到这里出了什么问题吗?

1 个答案:

答案 0 :(得分:3)

通过对您拥有的表达式进行深度嵌套,更难以解释错误。

在第

sql += " %s, " % db_util.formatierFeld(unicode(str(zeile[i]), "utf-8"), feldTypen[i])

异常来自哪里?这很难说。但是,我认为它来自str(zeile[i])。如果zeile[i]是包含非ASCII字符的unicode,则无法使用str将其转换为字节字符串。相反,您必须使用编解码器将其编码为字节字符串,该编解码器可以表示它包含的所有字符。

...然而

unicode(str(zeile[i]), "utf-8")

如果zeile[i]是unicode字符串,这是毫无意义的。首先,您尝试将其编码为字节字符串,然后尝试将其解码回unicode字符串。你可以跳过所有这些,只做zeile[i]formatierFeld并不重要,因为执行永远不会那么远。