str.format () вызывает KeyError


80

Следующий код вызывает KeyErrorисключение:

addr_list_formatted = []
addr_list_idx = 0

for addr in addr_list: # addr_list is a list
    addr_list_idx = addr_list_idx + 1
    addr_list_formatted.append("""
        "{0}"
        {
        "gamedir"  "str"
        "address"  "{1}"
        }
    """.format(addr_list_idx, addr))

Почему?

Я использую Python 3.1.


1
Вероятно, вы могли бы выполнить ту же задачу с пониманием списка (используйте enumerateдля получения индексов).
SwiftsNamesake

См. Также (дубликат) stackoverflow.com/questions/35574349/…
dreftymac 01

Ответы:


144

Проблема в том, что у вас там есть {и }символы, в которых не указан ключ для форматирования. Вам нужно удвоить их, поэтому измените свой код на:

addr_list_formatted.append("""
    "{0}"
    {{
    "gamedir"  "str"
    "address"  "{1}"
    }}
""".format(addr_list_idx, addr))

12
Что, если кто-то захочет использовать JSON в Python?
fijiaaron

4
@fijiaaron дубль {в ответе - это просто сказать formatметоду, что здесь нет ключа для форматирования (поэтому они экранируются в сформированной строке, и это не должно быть проблемой для создания JSON таким образом). В качестве альтернативы есть другие эффективные способы манипулирования строками, например joinметод:"".join(['{"', var_name, '":', value, '}'])
mgc

Я чуть не
сошел с

1
@DmitryKankalovich Вы сошли с ума, Stack Overflow, и все здесь - всего лишь плод вашего воображения. (по крайней мере, это то, что я продолжаю говорить себе) :)
Лассе В. Карлсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.