pysqlite2: ProgrammingError - Вы не должны использовать 8-битные строки байтов - PullRequest
13 голосов
/ 15 мая 2010

В настоящее время я сохраняю имена файлов в базе данных 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")])

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

Ответы [ 5 ]

14 голосов
/ 15 мая 2010

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

3 голосов
/ 10 июня 2010

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

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

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

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

1 голос
/ 11 января 2011

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

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

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

1 голос
/ 15 мая 2010

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

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

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

# coding: utf-8
0 голосов
/ 19 августа 2017

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

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

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

...