2013-12-19 3 views

ответ

13

Использование ast.literal_eval():

import ast 

ast.literal_eval(x) 

или рассматривать его как JSON, используя json.loads():

import json 

json.loads(x) 

ast.literal_eval() принимает литералов Python в качестве входных данных (так текст, который в Python исходный код даст вам значение), json.loads() принимает ввод JSON.

Демо:

>>> import ast, json 
>>> x = "[26, 25]" 
>>> ast.literal_eval(x) 
[26, 25] 
>>> json.loads(x) 
[26, 25] 

Разница между ними только приходит в игру, когда у вас есть больше, чем список целых чисел в вашей входной строки; Строки JSON содержат unicode, который ast.literal_eval() на Python 2 не будет интерпретировать правильно, а типы JSON - это только подмножество того, что поддерживает ast.literal_eval().

>>> x = '["List", "with", "strings", "including", "snowman", "\u2603"]' 
>>> ast.literal_eval(x) 
['List', 'with', 'strings', 'including', 'snowman', '\\u2603'] 
>>> json.loads(x) 
[u'List', u'with', u'strings', u'including', u'snowman', u'\u2603'] 
>>> x = "(1, 2, 3, 'a tuple is Python syntax, not JSON')" 
>>> ast.literal_eval(x) 
(1, 2, 3, 'a tuple is Python syntax, not JSON') 
>>> json.loads(x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 383, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 
0

Лучше, чем «Eval» (от безопасности и скорости (возможно) точки зрения) будет:

[int(v) for v in x[1:-1].replace(" ", "").split(",")] 
+0

Это оказалось быстрее, чем использование [safe eval] (http://docs.python.org/2/library/ast.html#ast.literal_eval) –

+2

Вам нужно было бы «map()' к 'int()', а также для получения целых чисел. –

+0

@MartijnPieters спасибо, отредактирован. – IProblemFactory

2

другой вариант, если вы знаете, что вы делаете правильные вещи

x = "[26, 25]" 
y = eval(x) 
print y 
+0

существует опасность впрыска вредоносного кода с этим подходом - если x считывается из файла, и хакер каким-то образом может изменить файл ... – drevicko

Смежные вопросы