2017-02-20 2 views
2

Этот код:Python не работает с текстом, содержащий JSON

'From {"value": 1}, value={value}'.format(value=1) 

терпит неудачу, как следующее (Python 2.7.12 и Python 3.6.x):

Traceback (most recent call last): 
    File "test_format.py", line 1, in <module> 
    'From {"value": 1}, value={value}'.format(value=1) 
KeyError: '"value" 

интерпретатор Python жалуется, что "value" не было передано в аргументах для метода format.

Но согласно format string syntax:

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" 
field_name  ::= arg_name ("." attribute_name | "[" element_index "]")* 
arg_name   ::= [identifier | integer] 
attribute_name ::= identifier 
element_index  ::= integer | index_string 
index_string  ::= <any source character except "]"> + 
conversion  ::= "r" | "s" 
format_spec  ::= <described in the next section> 

replacement_field, который в данном случае состоит в идентификатор, не должны иметь кавычки. Вот лексическое определение для идентификатора:

identifier ::= (letter|"_") (letter | digit | "_")* 
letter  ::= lowercase | uppercase 
lowercase ::= "a"..."z" 
uppercase ::= "A"..."Z" 
digit  ::= "0"..."9" 

Итак, в соответствии со спецификацией, {value} должны быть признаны в качестве действительного идентификатора строки формата и {"value"} следует игнорировать.

Возможно, Python не соответствует спецификации в документации. Что-либо внутри ключей принимается как идентификатор.

Почему python ведет себя так? Что мне здесь не хватает?

+1

Почему вы пытаетесь создать JSON с использованием '.format()' в первую очередь? Используйте модуль 'json'. – Barmar

+0

«{» значение «}' не может рассматриваться как поле замены, потому что «значение» является выражением, но не ключевым словом, цитата не разрешена. – LuCima

+0

@LuCima См. Traceback, Python жалуется на аргумент с именем '" value "' –

ответ

3

Если вы хотите иметь фактические скобки {} в вашем выводе, что вам нужно сделать это:

'{{"value": 1}}, {}'.format(0) 

Формат обрабатывает everythin в скобках {} в качестве аргументов. Пустые скобки означают позиционные значения, все остальное - в качестве аргумента ключевого слова.

+0

На самом деле, я пытаюсь использовать формат для текстов, содержащих действительный JSON. –

+1

В этом случае вы должны использовать модуль 'json', например, @Barmar. Загрузите свой действительный json через 'json.loads()' и измените поля напрямую. Или используйте 'format()' непосредственно в поле. –

+0

Я хочу смешать форматированные значения и закодированную строку JSON в конечной строке. Модуль 'json' не может этого сделать. –

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

  • Нет связанных вопросов^_^