Я в настоящее время сохраняю имена файлов в 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")])
На что должен здесь быть похожим мой код?
Вам нужно указать кодировку filename
для преобразования в Unicode, например: filename.decode('utf-8')
. Простое использование unicode(...)
выбирает кодировку консоли, которая часто ненадежна (и часто ascii
).
Вы пытались передать строку Unicode напрямую:
cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',))
Вам нужно будет добавить кодировку файла в начало скрипта:
# coding: utf-8
Вы должны передавать как Unicode аргументы вашего оператора SQL.
Теперь все зависит от того, как получить список имен файлов. Возможно, вы читаете файловую систему с помощью os.listdir
или os.walk
? Если это так, есть способ напрямую использовать имена файлов в формате Unicode, просто передав аргумент Unicode любой из этих функций:
Примеры:
os.listdir (u '.')
os.walk (u '.')
Конечно, вы можете заменить каталог u '.'
фактическим каталог, содержимое которого вы читаете. Просто убедитесь, что это строка Unicode.