Python: проблема кодирования

1

Я хочу скопировать данные из одной базы данных в другую базу данных. Поэтому для этой цели я написал Python script.

Имена на немецком языке, но я не думаю, что это будет проблемой для понимания моего вопроса.

script выполняет следующие действия

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 

Хорошо, некоторым из вас этот материал будет казаться довольно странным, но я могу уговорить вас, я ДОЛЖЕН сделать это таким образом, поэтому, пожалуйста, не обсуждайте стиль и т.д.

Хорошо, при запуске этого кода я получаю следующее сообщение об ошибке, когда я запускаю слова с помощью umlauts.

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.

Кто-нибудь догадывается, что здесь происходит не так?

Теги:
encoding

1 ответ

3

Ошибка сложнее интерпретировать с помощью глубокого вложения выражений, которые у вас есть.

В строке

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

Откуда возникает исключение? Трудно сказать. Однако я бы предположил, что он исходит от str(zeile[i]). Если zeile[i] - это unicode, содержащий не-ASCII-символы, то вы не можете преобразовать его в строку байта с помощью str. Вместо этого вы должны закодировать его в байтовую строку с помощью кодека, который может представлять все содержащиеся в нем символы.

Однако...

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

Это бессмысленно, если zeile[i] является строкой unicode. Сначала вы пытаетесь закодировать его в байтовую строку, а затем пытаетесь декодировать его обратно в строку юникода. Вы можете пропустить все это и просто сделать zeile[i]. formatierFeld не имеет большого значения, поскольку исполнение никогда не доходит до этого.

  • 0
    Спасибо за вашу помощь! Я решил это так, как вы предложили
  • 0
    Пожалуйста. Не забудьте принять ответ. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню