Python: проблема кодирования - PullRequest
1 голос
/ 23 мая 2011

Я хочу скопировать данные из одной базы данных в другую базу данных.Поэтому я написал скрипт 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 голосов
/ 23 мая 2011

Ошибка усложняется из-за глубокого вложения ваших выражений.

В строке

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

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

Однако ...

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...