【问题标题】:Config Parser Python - How to read from json file?Config Parser Python - 如何从 json 文件中读取?
【发布时间】:2018-02-27 05:31:58
【问题描述】:

我在我的script/.py 所在的文件夹中创建了一个profile.json 文件。它看起来像:

{
    "name": "",
    "lastname": "",
    "age": "",
    "city": "",
}

我希望将其插入到我的脚本中,该脚本的标题为:

"info": {
    "given_name": "",
    "given_Lastname": "",
    "given_age": "",
    "given_city": ""
}

我想知道如何才能将我的profile.json 读取到我的脚本中?这是我第一次使用它,我也是 Python 新手。我觉得这可能是一种修改信息的简单方法,而无需每次都更改代码。

编辑:

尝试这样做:

使用 open('profile.json', encoding='UTF-8') 作为 json_data: 配置 = json.load(json_data) 打印(配置)

然后:

"info": 
       {
         "given_name": config.given_name
       }

打印出来的信息很好,但是当涉及到 "given_name": config.given_name 时,我收到一条错误消息

AttributeError: 'dict' object has no attribute 'given_name'

【问题讨论】:

  • 使用json python包:docs.python.org/3.5/library/json.html
  • 我真的找不到在哪里可以将文件用于该文档中的脚本。要么我是盲人,要么它不存在
  • with open('<file_path>') as fp: json.load(fp)json.load
  • 但是如果我将文件从台式机发送到我的笔记本电脑,这是否意味着等等。我每次都需要更改文件路径吗?
  • 你能显示print(config)的结果吗?

标签: python json parsing config


【解决方案1】:

问题是您试图将字典键作为属性访问(即:config["given_name"] vs config.given_name。您还多次更改了问题,但您正在尝试做什么(我认为) 很简单。对于您给出的简单示例,您有一个 json 文件,其中只有一个 json 对象,这可能更接近您想要做的:

*注意:你的json语法错误,应该是{ "info": { ... } }

#!/usr/bin/env python3
'''profile.json:
{
    "name": "steve",
    "lastname": "jobs",
    "age": "70",
    "city": "heaven"
}
'''
import json
import io


# Open the JSON File and create a StringIO buffer to hold data
with open('profile.json', 'r') as datafile, io.StringIO() as data:
    # Load data into json file
    config = json.load(datafile)
    # Build json strong
    data.write(f'''{{
            \r\t"info": {{
            \r\t\t"given_name": "{config['name']}",
            \r\t\t"given_Lastname": "{config['lastname']}",
            \r\t\t"given_age": "{config['age']}",
            \r\t\t"given_city": "{config['city']}"
            \r\t}}\n}}''')
    print(data.getvalue())
    # open a new file to save the data (overwrite if it exists)
    with open('newfile.json', 'w') as outfile:
        # load the json string and dump to outfile
        deserialized = json.loads(data.getvalue())
        json.dump(deserialized, outfile)
        # newfile.json:
        #{
        #        "info": {
        #                "given_name": "steve",
        #                "given_Lastname": "jobs",
        #                "given_age": "70",
        #                "given_city": "heaven"
        #        }
        #}

这只是您提供给我的数据的一个简单示例,因此我制作了另一个使用 json 列表而不是 json dict 的示例:

[{
    "name": "steve",
    "lastname": "jobs",
    "age": "70",
    "city": "heaven"
},
{
    "name": "steve1",
    "lastname": "jobs1",
    "age": "71",
    "city": "heaven1"
},
{
    "name": "steve2",
    "lastname": "jobs2",
    "age": "72",
    "city": "heaven2"
},
{
    "name": "steve3",
    "lastname": "jobs3",
    "age": "73",
    "city": "heaven3"
},
{
    "name": "steve4",
    "lastname": "jobs4",
    "age": "74",
    "city": "heaven4"
}]

还有一个类似的脚本:

#!/usr/bin/env python3
'''profile.json:
'''
import json
import io


# Open the JSON File and create a StringIO buffer to hold data
# Note: StringIO provides a file-like interface over a string
with open('profile.json', 'r') as datafile, io.StringIO() as data:
    # Load data into json file
    config = json.load(datafile)
    # Build json strong
    data.write('{\n\t"info": [\n')
    #data.write('\t{')
    for jsonobj in config:
        data.write(f'''\t    {{
                \r\t\t"given_name": "{jsonobj['name']}",
                \r\t\t"given_Lastname": "{jsonobj['lastname']}",
                \r\t\t"given_age": "{jsonobj['age']}",
                \r\t\t"given_city": "{jsonobj['city']}"
                \r\t    }}''')

        # Note: There is a bug here.
        # This will not be able to handle duplicate objects in
        # the json list. For a trivial example like this, it works.
        if jsonobj == config[-1]:
            data.write('\n\t]\n}')
        else:
            data.write(',\n')
    # open a new file to save the data (overwrite if it exists)
    with open('newfile.json', 'w') as outfile:
        # We need to serialize the json data if we want to write to file
        deserialized = json.loads(data.getvalue())
        outfile.write(json.dumps(serialized))
        # or we can just print it
        print(serialized)

【讨论】:

    【解决方案2】:

    cmets 对您的原始问题提出了一些很好的建议。如果您想从另一个文件中提取可配置数据,您可以通过查看原始问题来执行两个选项。

    1.使用 json 文件

    看起来这是第一个建议的答案,您可以通过此 JSON 文件配置可在程序中使用的变量。假设 config.json 文件位于程序的当前目录中,您可以执行以下操作:

    import json
    
    with open('config.json', 'r') as config_file:
        config_data = json.load(config_file)
    

    2。使用 python 文件

    这是另一个选项,以防您在加载配置时不想反序列化 json。您可以将所有内容保留为 python 数据类型,因此您只需要导入它。在此示例中,CONFIG_INFO 只是一个字典,您可以将其导入到需要它的其他脚本中。我通常在工作中将其用于用户名/密码/常规配置。

    config.py

    CONFIG_INFO: {
        "given_name": "test name",
        "given_lastname": "test lastname",
        "given_age": 12,
        "given_city": "Seattle"
    }
    

    my_script.py

    from config import CONFIG_INFO
    
    print("Config City: {0}".format(CONFIG_INFO["given_city"]))
    print("Config Name: {0}".format(CONFIG_INFO["given_name"]))
    print("Config Lastname: {0}".format(CONFIG_INFO["given_lastname"]))
    print("Config Age: {0}".format(CONFIG_INFO["given_age"]))
    

    【讨论】:

    • 如果他使用json文件,他不需要读取内容并使用loadsload将是解析json文件的正确函数。
    • 很棒的@CharlesAddis。我不知道加载方法。我会在这里更新我的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多