我正在修改现有的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。
答案 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)。
那就是说,这是计划的样子:
dict
repr()
覆盖整个文件
dict
pprint.pprint()
覆盖整个文件
config.__file__
。