Вложенные списки Python заменяют символы юникода в строках

Попытка заменить или удалить строки в этом списке для вставки в базу данных, которая не позволяет их

info=[[u'\xa0Buffalo\u2019s League of legends ...', '2012-09-05'], [u' \xa0RCKIN 0 - 1 WITHACK.nq\xa0  ', u'\xa0Buffalo\u2019s League of legends ...', '2012-09-05']]

Я использовал этот код

info = [[x.replace(u'\xa0', u'') for x in l] for l in info]
info = [[y.replace('\u2019s', '') for y in o] for o in info]

первая строка работала, а вторая нет, есть предложения?


person user3386406    schedule 06.03.2014    source источник
comment
Я также попытался бы выяснить, почему вы получаете такую ​​странную строку, смешивающую необработанные байты и кодовые точки Unicode.   -  person Paulo Bu    schedule 06.03.2014
comment
Что вам нужно сделать, так это записать пулю в байты и узнать, как обрабатывать Unicode, декодируя его, когда вы читаете строку, а затем кодируете ее, когда вы будете готовы отправить ее в свою базу данных. Одно из мест для начала - здесь stackoverflow .com / questions / 2365411 /.   -  person PyNEwbie    schedule 06.03.2014


Ответы (2)


Отбросьте вторую строку и выполните:

info = [[x.encode('ascii', 'ignore')  for x in l] for l in info]

и посмотрите, приемлемы ли результаты. Это попытается преобразовать весь юникод в ascii и отбросить все символы, которые не удалось преобразовать. Вы просто хотите быть уверены, что если вы потеряете важный символ Юникода, это не проблема.

>>> info=[[u'\xa0Buffalo\u2019s League of legends ...', '2012-09-05'], [u' \xa0RCKIN 0 - 1 WITHACK.nq\xa0  ', u'\xa0Buffalo\u2019s League of legends ...', '2012-09-05']]
>>> info = [[x.encode('ascii', 'ignore')  for x in l] for l in info]
>>> info
[['Buffalos League of legends ...', '2012-09-05'], [' RCKIN 0 - 1 WITHACK.nq  ', 'Buffalos League of legends ...', '2012-09-05']]

Что происходит:

В вашей программе Python есть данные в Unicode (и это хорошо).

>>> u = u'\u2019'

Лучшая практика для взаимодействия - записывать строки Unicode в utf-8. Вот те байты, которые вы должны хранить в своей базе данных:

>>> u.encode('utf-8')
'\xe2\x80\x99'
>>> utf8 = u.encode('utf-8')
>>> print utf8
’

А затем, когда вы считываете эти байты обратно в свою программу, вы должны затем их декодировать:

>>> utf8.decode('utf8')
u'\u2019'
>>> print utf8.decode('utf8')
’

Если ваша база данных не может обрабатывать utf-8, я бы подумал о приобретении новой базы данных.

person Aaron Hall    schedule 06.03.2014
comment
Мне это больше нравится, чем замена. - person Paulo Bu; 06.03.2014

Потому что во второй форме \u2019s не считается строкой Unicode. Просто добавьте u в замену перед этим элементом, как это

print [[y.replace(u'\u2019s', '') for y in o] for o in info]]

Вывод

[[u'Buffalo League of legends ...', u'2012-09-05'],
 [u' RCKIN 0 - 1 WITHACK.nq  ',
  u'Buffalo League of legends ...',
  u'2012-09-05']]

Фактически, вы можете связать замену, например

[[x.replace(u'\xa0', '').replace(u'\u2019s', '') for x in l] for l in info]
person thefourtheye    schedule 06.03.2014