Ответ 1
Вам не нужно кодировать данные, которые уже закодированы. Когда вы попытаетесь это сделать, Python сначала попытается декодировать его до unicode
, прежде чем он сможет закодировать его обратно в UTF-8. Вот что здесь не получается:
>>> data = u'\u00c3' # Unicode data
>>> data = data.encode('utf8') # encoded to UTF-8
>>> data
'\xc3\x83'
>>> data.encode('utf8') # Try to *re*-encode it
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Просто напишите ваши данные непосредственно в файл, нет необходимости кодировать уже закодированные данные.
Если вместо этого вы создадите значения unicode
, вам действительно нужно будет закодировать их для записи в файл. Вместо этого вы хотите использовать codecs.open()
, который возвращает объект файла, который будет кодировать значения Unicode для UTF-8 для вас.
Вы также действительно не хотите записывать спецификацию UTF-8, если только вы не должны поддерживать инструменты Microsoft, которые не могут читать UTF-8 в противном случае (например, MS Notepad).
Для вашей проблемы с вставкой MySQL вам нужно сделать две вещи:
-
Добавьте
charset='utf8'
к вашему вызовуMySQLdb.connect()
. -
Используйте объекты
unicode
, а не объектыstr
при запросе или вставке, но используйте параметры sql, чтобы соединитель MySQL мог сделать для вас правильные вещи:artiste = artiste.decode('utf8') # it is already UTF8, decode to unicode c.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s', (artiste,)) # ... c.execute('INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)', (artiste, artiste + u'/'))
Он может работать лучше, если вы использовали codecs.open()
для автоматического декодирования содержимого:
import codecs
sql = mdb.connect('localhost','admin','ugo&([email protected]','music_vibration', charset='utf8')
with codecs.open('config/index/'+index, 'r', 'utf8') as findex:
for line in findex:
if u'#artiste' not in line:
continue
artiste=line.split(u'[:::]')[1].strip()
cursor = sql.cursor()
cursor.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s', (artiste,))
if not cursor.fetchone()[0]:
cursor = sql.cursor()
cursor.execute('INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)', (artiste, artiste + u'/'))
artists_inserted += 1
Возможно, вы захотите освежить Unicode и UTF-8 и кодировки. Я могу порекомендовать следующие статьи: