Unicode - String - список манипуляций - PullRequest
3 голосов
/ 13 апреля 2011

У меня есть данные s = u"[u'38', u'36', u'34', u'32']", которые имеют тип данных Unicode я хочу сделать эти данные простым списком элементов вроде s= ['38','36','32'],
я пытаюсь использовать simplejson.loads, но он не работает, простой json работает с ('["s"]') этим типом строки, а не ("['s']"), поэтому любой приятель, пожалуйста, направьте меня, чтобы получить эту проблему

спасибо заранее

Ответы [ 4 ]

9 голосов
/ 13 апреля 2011
>>> import ast
>>> s = u"[u'38', u'36', u'34', u'32']"
>>> [ item.encode('ascii') for item in ast.literal_eval(s) ]
['38', '36', '34', '32']
1 голос
/ 13 апреля 2011

Ну, проблема в том, что эта строка не является допустимым синтаксисом JSON. Это допустимый Python синтаксис, но не JSON, по двум причинам:

  1. JSON не допускает строки в одинарных кавычках, '38', только двойные кавычки, "38".
  2. JSON не допускает u перед строкой, u"38", только пустые строки, которые неявно являются Unicode, "38".

Вам нужно либо изменить формат ввода, либо использовать что-то, что может обрабатывать строки Python.

Вы можете использовать eval, который читает строки, содержащие синтаксис Python, но учтите, что это очень опасно, если вы принимаете произвольный ввод, поскольку кто-то может предоставить код для выполнения. Тем не менее, это работает:

>>> eval(u"[u'38', u'36', u'34', u'32']")
[u'38', u'36', u'34', u'32']

Редактировать : ответ Хачика, вероятно, лучше, чем eval, поскольку он не будет восприимчив к оценке произвольного кода Python, только к чтению структур данных Python.

1 голос
/ 13 апреля 2011

Если доступно ast, можно использовать ast.literal_eval.

0 голосов
/ 13 апреля 2011

Используйте модуль re, чтобы разбить вашу строку на необходимые элементы.Например

re.findall("u\'([^\']+)\'", u"[u'38', u'36', u'34', u'32']")
...