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")]) 

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

  • Вопрос Sqlite insert не работает с python?
  • Блокировка строки с помощью SQLite (блокировка чтения?)
  • Настройка каталога хранилища SQL-файлов
  • Слияние баз данных SQLite сводит меня с ума. Помогите?
  • Как проверить, существует ли таблица?
  • Как подключить Javascript к Python для совместного использования данных в формате JSON в обоих направлениях?
  • нужна проверка и добавление базы данных sqlite для ведения домашнего хозяйства и управления кодом
  • Передача имени столбца в инструкции SELECT в Python
  • 5 Solutions collect form web for “pysqlite2: ProgrammingError – вы не должны использовать 8-битные байты”

    Вам нужно указать кодировку имени filename для преобразования в Юникод, например: 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 из cursor.execute («select * from musiclibrary, где absolutepath =?;», [Filename.decode («utf-8»)]), как в настоящее время задает вопрос.

    Либо дешифрование utf-8 взорвалось, либо вызов cursor.execute был бы доволен результатом.

    Попытайтесь изменить это:

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

    В имени файла, которое не кодируется с помощью utf8 , измените utf8 на вашу кодировку.

    Python - лучший язык программирования в мире.