str.format() 引发 KeyError

问题描述 投票:0回答:2

以下代码引发

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.

python syntax string-formatting delimiter missing-data
2个回答
167
投票

问题是那些

{
}
字符没有指定格式化键。您需要将它们加倍,因此将您的代码更改为:

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

0
投票

使用

str.format()
格式化 JSON 字符串并不理想,因为您必须转义大括号,如已接受的答案所述。

虽然这种方法可能适用于小型 JSON 模板,但如果有很多花括号需要转义,它可能会使模板难以阅读。

更好的选择是 string.Template:

from string import Template

addr_list = ["address 1, country 1", "address 2, country 2"]

addr_list_formatted = []
addr_list_idx = 0

template = Template("""
"${index}"
{
"gamedir"  "str"
"address"  "${address}"
}
""")

for addr in addr_list:
    addr_list_idx = addr_list_idx + 1
    formatted = template.substitute(index=addr_list_idx, address=addr)
    addr_list_formatted.append(formatted)
© www.soinside.com 2019 - 2024. All rights reserved.