【问题标题】:How can I call variables and strings together from a json file in Python?如何从 Python 中的 json 文件中调用变量和字符串?
【发布时间】:2020-04-16 05:19:22
【问题描述】:

我正在尝试在一行中打印变量和字符串。 喜欢[你好!姓名 你好吗?] -> [你好!约翰,你好吗?]

json 文件

#json01.json
{
"greet" : ["Hello! *name* How are you?"] # I don't know how to write this part..
}

这就是我所在的地方..

import json

a = 'greet'
name = 'John'

with open('json01.json') as json_file:
json_dict = json.load(json_file)

if a in json_dict:
    print(json_dict[a]) # I don't know how to write this part as well.. 

我应该怎么做才能得到我想要的结果?

抱歉解释不佳,谢谢!

【问题讨论】:

  • 这是什么错误?
  • @HarshaBiyani 这不是调试请求,问题是如何使输出字符串在正确的位置插入name。现有代码完全忽略了这一点。

标签: python json python-3.x


【解决方案1】:

在python中有多种格式化字符串的方法。

这里有 3 个例子:

"Hello! %s How are you?" % name
"Hello! %(name)s How are you?" % locals()
"Hello! {name} How are you?".format(name=name)

在网上搜索“python 字符串格式化”,你会发现很多有用的东西。

【讨论】:

  • 从json解码到字典时是否有效?
  • 当然,json_dict[a] 是一个返回字符串的表达式
  • 如何获取字典并不重要。重要的是你从字典中拉出一个字符串(就像你已经拥有的json_dict[a]一样),其中包含正确的“模板”内容(你可以通过编辑.json文件来匹配),并且然后使用匹配的代码将占位符替换为所需的 name 值。
  • @shx2 - 我不明白建议的方法和 f 字符串之间的区别。能给我一个线索吗? "Hello! {name} How are you?".format(name=name) 不等于 f"Hello! {name} How are you?" 吗?
  • @kajakIYD,正如答案所言,没有区别。但是,这 3 个示例适用于该问题,因为您可以替换 ""Hello! ..." 与json_dict[a]。我认为您不能将这样的表达式与 f 字符串结合使用(因为模板在运行时不是固定的并且是已知的)。
【解决方案2】:

如果您想将多个变量“替换”到字符串中,并明确指出您要实例化什么而不在.format() 中输入许多参数:

  1. 创建字典。键应该是要在获取的字符串中替换的字符串,值应该是代替键出现的变量。
  2. 使用双星号 **namespace 字典中提取键以将字典“解包”到 .format() 参数列表中,以用获取的字符串中的值替换键

根据你的例子:

import json

a = 'greet'
name = 'John'
weight = 80
height = 190
age = 23
# 1.
namespace = {'name': name, 'age': age, 'weight': weight, 'height': height}

json_dict_all_keys = json.loads('{"greet" : "Hello! {name}, {age} years old, {height}cm, {weight}kg. How are you?"}')
json_dict_some_keys = json.loads('{"greet" : "Hello! {name}, {weight}kg. How are you?"}') 
json_dict_mixed_keys = json.loads('{"greet" : "Hello! {name}, {other} years old, {key}cm, {weight}kg. How are you?"}')
json_dict_none_of_keys = json.loads('{"greet" : "Hello! {some}, {other} years old, {key}cm, {here}kg. How are you?"}')

if a in json_dict:
    # 2.
    print(json_dict_all_keys[a].format(**namespace))  # Hello! John, 23 years old, 190cm, 80kg. How are you?
    print(json_dict_some_keys[a].format(**namespace))  # Hello! John, 80kg. How are you?
    print(json_dict_mixed_keys[a].format(**namespace))  # Raising KeyError!
    print(json_dict_none_of_keys[a].format(**namespace))  # Raising KeyError too!

如您所见,不需要使用来自namespace 的所有“密钥”。 但要小心 - 当您要格式化的字符串中出现 namespace 中未包含的“key”时,会发生 KeyError。

为了简化解释,我使用了json.loads,而不是使用json.load从文件中加载json。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2015-07-29
    • 2021-05-27
    相关资源
    最近更新 更多