Python: 编码问题

1 投票
1 回答
768 浏览
提问于 2025-04-16 18:10

我想把一个数据库里的数据复制到另一个数据库里。为此,我写了一个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 个回答

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,其实并不重要,因为程序根本不会执行到那一步。

撰写回答