代码之家  ›  专栏  ›  技术社区  ›  WeInThis

配置解析器Python-如何读取json文件?

  •  2
  • WeInThis  · 技术社区  · 9 年前

    profile.json 与我的文件位于同一文件夹中 script/.py 是它看起来像:

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

    我希望将其插入到我的脚本中,该脚本包含以下标题:

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

    我想知道我怎样才能阅读我的 加入我的剧本?这是我第一次使用它,我也是Python新手。我觉得这是一种修改信息的简单方法,无需每次都更改代码。

    编辑:

    将open('profile.json',encoding='UTF-8')作为json_数据: 配置=json。加载(json_数据) 打印(配置)

    然后:

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

    “给定名称”:配置。给定名称 然后我得到一个错误,说

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

    2 回复  |  直到 9 年前
        1
  •  5
  •   Kyle    9 年前

    从你对原始问题的评论中,有一些很好的建议。如果你想从另一个文件中提取可配置数据,你可以通过查看原始问题来做两个选择。

    1.使用json文件

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

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

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

    配置。py公司

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

    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"]))
    
        2
  •  2
  •   Charles    9 年前

    问题是,您试图将字典键作为属性访问(即: config["given_name"] config.given_name . 你也多次改变你的问题,但你想做的(我认为)很简单。对于您给出的一个简单示例,其中您有一个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)
    
    推荐文章