pysqlite2: ProgrammingError-вы не должны использовать 8-битные bytestrings

в настоящее время я сохраняю имена файлов в базе данных sqlite для своих собственных целей. Всякий раз, когда я пытаюсь вставить файл, который имеет особый характер (например, é и т. д.), он выдает следующую ошибку:

pysqlite2.dbapi2.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

когда я делаю "переключить мое приложение на строки Юникода", обернув значение, отправленное в pysqlite с помощью метода Юникода, как:unicode(filename), он выдает эту ошибку:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)

что-то я могу сделать, чтобы избавиться от этого? Изменение всех моих файлов в соответствии не вариант.

обновление Если я декодирую текст через filename.decode("utf-8"), Я все еще получаю ProgrammingError выше.

мой фактический код выглядит так:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [filename.decode("utf-8")])

как должен выглядеть мой код здесь?

5 ответов


необходимо указать кодировку filename для преобразования в Unicode, например:filename.decode('utf-8'). Просто используя unicode(...) выбирает кодировку консоли, которая часто ненадежна (и часто ascii).


вы должны передать как Unicode аргументы вашего оператора SQL.

теперь все зависит от того как вы получаете список файлов. Возможно, Вы читаете файловую систему с помощью os.listdir или os.walk? Если это так, есть способ иметь непосредственно имена файлов как Unicode, просто передав аргумент Unicode любой из этих функций:
Примеры:

  • os.listdir(u'.')
  • os.walk(u'.')

конечно, вы может заменить u'.' каталог с фактическим каталогом, содержимое которого Вы читаете. Просто убедитесь, что это строка Unicode.


вы пытались передать строку unicode напрямую:

cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',))

вам нужно добавить кодировку файла в начале скрипта:

# coding: utf-8

вы уже поняли это, но:

Я не думаю, что вы действительно можете получить это исключение ProgrammingError от курсора.execute ("выберите * из musiclibrary, где absolutepath = ?;", [имя файла.decode ("utf-8")]), как говорится в вопросе в настоящее время.

либо декодирование utf-8 взорвется, либо курсор.execute call будет доволен результатом.


попробуйте изменить на это:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [unicode(filename,'utf8')])

в вашем имени файла origin не кодировать с utf8 изменить utf8 к вашей кодировке.