Вставить юникод в sqlite? - PullRequest
       1

Вставить юникод в sqlite?

3 голосов
/ 11 февраля 2012

Я все еще изучаю Python, и в качестве небольшого проекта я написал скрипт, который бы брал значения, которые у меня есть, в текстовом файле и вставлял их в базу данных sqlite3.Но у некоторых имен есть странные буквы (я думаю, вы бы назвали их не-ASCII), и они генерируют ошибку, когда они появляются.Вот мой маленький сценарий (и, пожалуйста, скажите, если он есть, он может быть более Pythonic): import sqlite3

f = open('complete', 'r')
fList = f.readlines()
conn = sqlite3.connect('tpb')
cur = conn.cursor()

for i in fList:
    exploaded = i.split('|')
    eList = (
        (exploaded[1], exploaded[5])
    )
    cur.execute('INSERT INTO magnets VALUES(?, ?)', eList)
    conn.commit()
cur.close()

И он генерирует эту ошибку:

Traceback (most recent call last):
  File "C:\Users\Admin\Desktop\sortinghat.py", line 13, in <module>
    cur.execute('INSERT INTO magnets VALUES(?, ?)', eList)
sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a te
xt_factory that can interpret 8-bit bytestrings (like text_factory = str). It is
highly recommended that you instead just switch your application to Unicode str
ings.

1 Ответ

4 голосов
/ 11 февраля 2012

Чтобы получить содержимое файла в юникоде, вам необходимо декодировать из любой кодировки, в которой он находится.
Похоже, вы работаете в Windows, поэтому лучше всего ставить cp1252.
Если вы получили файл изгде-то еще все ставки сняты.

После сортировки кодировки простой способ декодирования - использовать модуль codecs, например:

import codecs
# ...
with codecs.open('complete', encoding='cp1252') as fin: # or utf-8 or whatever
  for line in fin:
    to_insert = (line.split('|')[1], line.split('|')[5])
    cur.execute('INSERT INTO magnets VALUES (?,?)', to_insert)
    conn.commit()
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...