Строка управления данными Python в dict и затем кадр данных [дубликат]

Bootstrap использует переходы CSS3, поэтому индикаторы выполнения автоматически анимируются, когда вы устанавливаете ширину .bar trough javascript / jQuery.

http://jsfiddle.net/3j5Je/ ..видеть?

561
задан Bhargav Rao 30 October 2016 в 20:02
поделиться

11 ответов

Начиная с Python 2.6 вы можете использовать встроенный ast.literal_eval :

>>> import ast
>>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}")
{'muffin': 'lolz', 'foo': 'kitty'}

Это безопаснее, чем при использовании eval. Как говорят его собственные документы:

>>> help(ast.literal_eval)
Help on function literal_eval in module ast:

literal_eval(node_or_string)
    Safely evaluate an expression node or a string containing a Python
    expression.  The string or node provided may only consist of the following
    Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
    and None.

Например:

>>> eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
  File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 208, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 206, in rmtree
    names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mongo'
>>> ast.literal_eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string
857
ответ дан Josh Lee 16 August 2018 в 12:02
поделиться
  • 1
    Почему это лучшее решение, чем eval ()? – Triptych 12 June 2009 в 19:36
  • 2
    @Triptych: хороший вопрос, уточнил ... – Jacob Gabrielson 12 June 2009 в 19:43
  • 3
    заставляет меня плакать, что мы стандартизировали на python 2.4 – David Berger 12 June 2009 в 19:46
  • 4
    Я должен добавить, что вам нужно дезинфицировать строку для использования с ast.literal_eval. (обеспечить, чтобы кавычки / двойные кавычки в строке были экранированы) – Paulo Matos 4 October 2012 в 11:10
  • 5
    Я получаю эту ошибку Я нахожусь на python 2.6 (x86) в Windows 7 x64 Файл «D: \ Python26 \ lib \ ast.py», строка 48, в literal_eval node_or_string = parse (node_or_string, mode = 'eval') Файл & quot; D: \ Python26 \ lib \ ast.py & quot ;, строка 36, в компиляции с возвратом результата (expr, filename, mode, PyCF_ONLY_AST) Файл & quot; & lt; unknown & gt ;, строка 1 ^ СинтаксисError: недопустимый синтаксис – user 10 December 2012 в 09:38

Подводя итог:

import ast, yaml, json, timeit

descs=['short string','long string']
strings=['{"809001":2,"848545":2,"565828":1}','{"2979":1,"30581":1,"7296":1,"127256":1,"18803":2,"41619":1,"41312":1,"16837":1,"7253":1,"70075":1,"3453":1,"4126":1,"23599":1,"11465":3,"19172":1,"4019":1,"4775":1,"64225":1,"3235":2,"15593":1,"7528":1,"176840":1,"40022":1,"152854":1,"9878":1,"16156":1,"6512":1,"4138":1,"11090":1,"12259":1,"4934":1,"65581":1,"9747":2,"18290":1,"107981":1,"459762":1,"23177":1,"23246":1,"3591":1,"3671":1,"5767":1,"3930":1,"89507":2,"19293":1,"92797":1,"32444":2,"70089":1,"46549":1,"30988":1,"4613":1,"14042":1,"26298":1,"222972":1,"2982":1,"3932":1,"11134":1,"3084":1,"6516":1,"486617":1,"14475":2,"2127":1,"51359":1,"2662":1,"4121":1,"53848":2,"552967":1,"204081":1,"5675":2,"32433":1,"92448":1}']
funcs=[json.loads,eval,ast.literal_eval,yaml.load]

for  desc,string in zip(descs,strings):
    print('***',desc,'***')
    print('')
    for  func in funcs:
        print(func.__module__+' '+func.__name__+':')
        %timeit func(string)        
    print('')

Результаты:

*** short string ***

json loads:
4.47 µs ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
builtins eval:
24.1 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
ast literal_eval:
30.4 µs ± 299 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
yaml load:
504 µs ± 1.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

*** long string ***

json loads:
29.6 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
builtins eval:
219 µs ± 3.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
ast literal_eval:
331 µs ± 1.89 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
yaml load:
9.02 ms ± 92.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Вывод: предпочитают json.loads

0
ответ дан Anatoly Alekseev 16 August 2018 в 12:02
поделиться

Если для строки может быть всегда доверено, вы можете использовать eval (или использовать literal_eval, как было предложено, это безопасно, независимо от того, какая строка.) В противном случае вам нужен синтаксический анализатор. Парсер JSON (например, simplejson) будет работать, если он только когда-либо хранит контент, соответствующий схеме JSON.

20
ответ дан Blixt 16 August 2018 в 12:02
поделиться
  • 1
    Начиная с версии 2.6, simplejson включен в стандартную библиотеку Python в качестве модуля json. – Eli Courtwright 12 June 2009 в 19:37
  • 2
    Ах, 2.6 кажется потрясающим! Я застрял с 2.5 и плохо разбирался в новых функциях в последнее время ... Мне придется читать все остальные новые вещи, как я полагаю, =) – Blixt 12 June 2009 в 19:47
  • 3
    Да, это хороший ответ, но обратите внимание, что официально JSON не поддерживает одиночные кавычки, как указано в примере с оригинальным плакатом. – Ben Hoyt 14 June 2009 в 22:30
  • 4
    Супер-ответ, я верю, я буду экспериментировать! – SIslam 3 November 2015 в 13:23

http://docs.python.org/2/library/json.html

JSON может решить эту проблему, хотя его декодер хочет получить двойные кавычки вокруг ключей и значений. Если вы не против замены hack ...

import json
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
json_acceptable_string = s.replace("'", "\"")
d = json.loads(json_acceptable_string)
# d = {u'muffin': u'lolz', u'foo': u'kitty'}

Учтите, что если у вас есть одинарные кавычки в качестве части ваших ключей или значений, это не будет выполнено из-за неправильной замены символа. Это решение рекомендуется только в том случае, если у вас есть сильное отвращение к eval-решению.

Подробнее о json single quote: jQuery одинарная кавычка в ответе JSON

124
ответ дан Community 16 August 2018 в 12:02
поделиться

Пример OP:

s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

Мы можем использовать Yaml для работы с этим нестандартным json в строке:

>>> import yaml
>>> s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
>>> s
"{'muffin' : 'lolz', 'foo' : 'kitty'}"
>>> yaml.load(s)
{'muffin': 'lolz', 'foo': 'kitty'}
21
ответ дан lqhcpsgbl 16 August 2018 в 12:02
поделиться
  • 1
    Это приведет к тому, что строки «да» и «нет» будут преобразованы в True / False – Eric Marcos 18 August 2017 в 17:57
  • 2
    Это не будет работать, если присутствует::, например, одно значение - URL – Mohammad Shahid Siddiqui 19 November 2017 в 19:28

Если вы не можете использовать Python 2.6, вы можете использовать простое safeeval immenentation, например http://code.activestate.com/recipes/364469/

. Это контрейлеры на компиляторе Python, поэтому вам не нужно делать всю грубую работу самостоятельно.

5
ответ дан Ned Batchelder 16 August 2018 в 12:02
поделиться

никакие libs не используются:

dict_format_string = "{'1':'one', '2' : 'two'}"
d = {}
elems  = filter(str.isalnum,dict_format_string.split("'"))
values = elems[1::2]
keys   = elems[0::2]
d.update(zip(keys,values))

ПРИМЕЧАНИЕ. Поскольку он имеет hardcoded split("'"), он будет работать только для строк, где данные «одинарные».

80
ответ дан Simon 16 August 2018 в 12:02
поделиться
  • 1
    Я не думаю, что он отвечает на ответ OP. Как мы используем json.laads для преобразования строки s = & quot; {'muffin': 'lolz', 'foo': 'kitty'} & quot; диктовать? – technazi 13 May 2016 в 14:28
  • 2
    почему это печать «u» на выходе? например, - str = '{"1": "P", "2": "N", "3": "M"}' d = json.loads (str) print d output: {u'1 ': u'P', u'3 ': u'M', u'2 ': u'N'} – 9codie05 13 July 2016 в 18:24
  • 3
    @ 9codie05: u обозначает представление Unicode. – tokhi 14 July 2016 в 09:43
  • 4
    но имеет свои пределы: попробуйте преобразовать строку & quot; {'foo': 'bar',} & quot; – ntg 8 December 2016 в 16:04
  • 5
    @technazi: json.loads (h.replace (& quot; '& quot ;, & quot;')) – ntg 8 December 2016 в 16:08
  • 6
    На мой взгляд, это самый короткий и простой способ ... Определенно тот, который я лично предпочитаю. – nostradamus 11 January 2017 в 09:40
string = "{'server1':'value','server2':'value'}"

#Now removing { and }
s = string.replace("{" ,"");
finalstring = s.replace("}" , "");

#Splitting the string based on , we get key value pairs
list = finalstring.split(",")

dict ={}
for i in list:
    #Get Key Value pairs separately to store in dictionary
    keyvalue = i.split(":")

    #Replacing the single quotes in the leading.
    m= keyvalue[0].strip('\'')
    m = m.replace("\"", "")
    dict[m] = keyvalue[1].strip('"\'')

print dict
4
ответ дан Siva Kameswara Rao Munipalle 16 August 2018 в 12:02
поделиться

Вы можете попробовать это.

    >>> import ast
    >>> data = "{'user': 'bob', 'age': 10, 'grades': ['A', 'F', 'C']}"
    >>> ast.literal_eval(data)

    O/P: {'age': 10, 'grades': ['A', 'F', 'C'], 'user': 'bob'}

    >>> user = ast.literal_eval(data)

    >>> user['age']
    O/P: 10

    >>> user['grades']
    O/P: ['A', 'F', 'C']

    >>> user['user']
    O/P: 'bob'
5
ответ дан Sonu 16 August 2018 в 12:02
поделиться
84
ответ дан Simon 6 September 2018 в 06:04
поделиться
89
ответ дан Simon 29 October 2018 в 12:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: