pysqlite вставка Unicode данных 8-битная ошибка проверки строки - PullRequest
0 голосов
/ 30 апреля 2011

Я знаю, что подобные перестановки этого вопроса задавались ранее, но ответы, похоже, не проливают свет на то, что я здесь делаю неправильно.

Я пытаюсь вставить эту строку: (Pdb)строка печати ['886', '39', '83474', '0', '0', '0', '0', '0', '1.00', 'D', '20070813', 'R', 'C', 'B', 'SOCK 4PK', '\ xe9 \ x9e \ x8b \ xe5 \ xad \ x90 \ xe5 \ xb0 \ xba \ xe5 \ xaf \ xb86-9.5 / 24-27.5CM', 'PR']

в эту таблицу: CREATE TABLE item ("whs" int, "dept" int, "item" int, "dsun" int, "oh" int, "ohrtv" int, "adjp" int, "adjn" int, "sell" текст, "stat" текст, "lsldt" int, текст "cat1", текст "cat2", текст "cat3", текст "des1", текст "sgn3", текст "unit");

Кажется, что столбец sgn3 вызывает проблемы.Он определен как TEXT, а данные для вставки - utf-8.Почему я получаю ошибку sqlite3?

ProgrammingError: «Вы не должны использовать 8-битные строки байтов, если вы не используете text_factory, который может интерпретировать 8-битный bytestr ... = str).Настоятельно рекомендуется вместо этого просто переключить свое приложение на строки Unicode. '

Вот код, выполняющий вставку:

query = 'insert into %s values(%s)' % (
    self.tablename,
    ','.join(['?' for field in row])
)
self.con.execute(query, row)

А вот процедура, которая создает генератор записейбыть вставленным:

def encode_utf_8(self, csv_data, csv_encoding):
    """Decodes from 'csv_encoding' and encodes to utf-8.  

    Accepts any open csv file encoding using any scheme recognized by 
    python. Returns a generator.  

    """
    for line in csv_data:
        try:
            yield line.decode(csv_encoding).encode('utf-8')
        except UnicodeDecodeError:
            next

1 Ответ

4 голосов
/ 30 апреля 2011

Это одно из самых полезных сообщений об ошибках, которые я когда-либо видел.Просто делай то, что говорит.Кормите его unicode объектами, а не str объектами в кодировке UTF-8.Другими словами, потерять .encode('utf-8') или, может быть, последовать этому позже декодированием ('utf-8') ... что именно точно равно csvdata?

Если вы когда-либо получитеUnicodeDecodeError в вашем существующем коде:

(1) Вы должны сделать что-то гораздо более полезное, чем то, что вы намеревались сделать с ним (смести его под ковер)

(2)изменить next на pass

Ответ на комментарий

хаха, это очень полезное сообщение об ошибке

ха ???Я не шутил;он точно говорит вам, что делать.

csvdata - это файл CSV, в данном случае кодирование с использованием big5 в python 2.x

Что вы называете "файлом CSV"":

(1) csvdata = open('my_big5_file', 'rb')
(2) csvdata = csv.reader(open('my_big5_file', 'rb'))
(3) other; please specify 

, если я решу не кодировать в utf-8, мои строки будут правильными?

Совершенно неправильно .bytes_read_from_file.decode('big5') производит объект unicode.Вы можете прочитать Python Unicode HOWTO .

, поэтому мне нужно явно изменить их на Unicode перед сохранением в базе данных?

Нетони уже unicode.Однако, в зависимости от csvdata, вы можете захотеть закодировать в utf8, чтобы получить их через механизм csv, а затем декодировать их позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...