如何在Python中以编程方式更新配置文件

时间:2018-04-10 17:29:53

标签: python

我正在修改现有的Python代码,我看到config.py的内容如下

person = {
       'peter': {
            'age' : '60',
             'sex' : 'm',
             'phone' : '999 999 999'
        },
        'sara': {
            'age' : '68',
             'sex' : 'f',
             'phone' : '111 111 111'
        }
}

Python程序有:

import config
# config item is accessed as below
print config.person['peter']['age']

我有2个问题,首先,config.py中的这种格式叫什么?我可以将其称为Python内置数据结构吗?因为这不是JSON。

其次,如何更新config.py条目(或添加新人),例如,如何将config.person['sara']['phone']更改为888 888 888?或者添加新人zac

我正在使用python3。

3 个答案:

答案 0 :(得分:2)

格式只是普通的可执行Python源代码。

当您需要以编程方式更改内容时,通常不使用此格式,但具有一些基本Python知识的人可以在简单的文本编辑器中编辑它。

例如,要在文本编辑器中更改Sara的电话号码,您只需转到此行:

         'phone' : '111 111 111'

...并将其更改为:

         'phone' : '888 888 888'

同样,要添加其他人,您可以复制并粘贴其中一个现有人的条目并进行编辑。

但是如果你想让你的脚本编辑这个文件,它需要解析Python源代码(例如,使用ast模块),将赋值映射到一组键值对,修改值,将结果转回一组赋值,然后将其转换回源代码。或者它可以做一些更简单和更黑的同样的效果。但关键是,没有简单明了的方法以编程方式编辑此文件。我不想提供执行此解析和生成的代码,因为如果您不知道怎么做,并且没有通过安全考虑,那么您应该做的事情真的不是影响等。

如果您需要配置文件,可以通过编程方式进行编辑,请将其替换为JSON之类的内容。这对于人类编辑来说同样容易,但它还具有额外的好处,即您的程序也可以轻松编辑,并且本身可以防止错误或恶意的错误数据。

如果您或您的用户已经使用config.py格式进行部署,您可以编写可以追溯到"遗留"如果找不到JSON文件,则配置文件,如下所示:

try:
    with open('config.json') as f:
        config = json.load(f)
except FileNotFoundError:
    try:
        import config
    except Exception as e:
        raise SomeMoreAopropriateError(…)
    with open('config.json', 'w') as f:
        json.dump(config, f)

(如果使用旧代码,例如execfile代替import,当然也会在此处执行相同的操作。)

答案 1 :(得分:0)

您可以使用update方法在词典中添加新条目:

In [46]: person.update({'another':{"age":'45',"sex":"m","phone":"811 345 678"}})

In [47]: person
Out[47]: 
{'another': {'age': '45', 'phone': '811 345 678', 'sex': 'm'},
 'peter': {'age': '60', 'phone': '999 999 999', 'sex': 'm'},
 'sara': {'age': '68', 'phone': '111 111 111', 'sex': 'f'}}

用于更新现有值,您可以使用名称作为键,另一个键用于年龄,男性或性别

In [48]: person['another']['age']='50' 

In [49]: person
Out[49]: 
{'another': {'age': '50', 'phone': '811 345 678', 'sex': 'm'},
 'peter': {'age': '60', 'phone': '999 999 999', 'sex': 'm'},
 'sara': {'age': '68', 'phone': '111 111 111', 'sex': 'f'}}

答案 2 :(得分:0)

它只是一个普通的dict

最有可能的是,this file is imported like a module, after which you can access config.person as a Python object

现在,这个配置格式不应该以编程方式覆盖,原因很简单:a .py is code rather than data and can have arbitrary logic in it无论如何你都希望这样做,你需要跳过篮球。如果你只需要结构化数据,没有任何逻辑,那么你最好使用JSON(参见json module)。

那就是说,这是计划的样子:

  1. 选择生成的文件内容的外观。选项包括:
    • 使用dict
    • repr()覆盖整个文件
    • 使用dict
    • pprint.pprint()覆盖整个文件
    • 手动逐行编辑文件
  2. 在适当的时候,将选定的表示写入文件。它的路径can be found as config.__file__