pysqlite2: ProgrammingError - Вы не должны использовать 8-разрядные строки байтов

Я в настоящее время сохраняю имена файлов в 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.

Когда я действительно "переключаю свое приложение на строки Unicode" путем обертывания значения, отправленного в pysqlite с unicode методом как: 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")])

На что должен здесь быть похожим мой код?

13
задан Naftuli Kay 14 May 2010 в 23:22
поделиться

3 ответа

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

14
ответ дан 1 December 2019 в 23:31
поделиться

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

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

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

# coding: utf-8
1
ответ дан 1 December 2019 в 23:31
поделиться

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

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

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

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

3
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: