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

Відповіді:


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.