我有一个.yml配置文件,它根据我运行程序的客户端控制程序的所有文件I/O。客户端名称应该位于YAML文件中给定的路径中的某个位置,例如:
client: CLIENT_1
data:
raw-file-path: D://Users//product//data//raw//CLIENT_1//CLIENT_1_data.csv
processed-data-file-path: D://Users//product//data//processed//CLIENT_1//CLIENT_1_processed_data.csv
有多个客户端,它们的数据始终位于命名的子目录中。我的代码接收每个客户端的原始数据,并在适当的目录中生成处理后的数据,如上面的示例所示。在大多数情况下,我想为单个客户端运行脚本,这样我就可以编辑我显示的config.yml
文件,但我希望能够以编程方式进行编辑。我在ArgumentParser中添加了一个--clients
参数:parser.add_argument('--clients', nargs='+', default=[], help='list of clients')
,以允许将客户端列表作为输入,例如python run.py --config config.yml --clients CLIENT_1 CLIENT_2
我想找到一种方法来操作所有这些路径,以指向适当的目录,甚至利用f字符串之类的东西命名文件,但我不知道如何做到这一点。我发现的最接近的问题是:用Yaml文件利用Python f字符串?,但它指的是我不熟悉的Jinja2模板。有更简单的方法吗?
有一个Python包可以从YAML/JSON/dicts智能地构建对象,并且正在积极开发和扩展中。(完整披露,我是这个包的合著者,请参阅此处(
此外,还有一些传入参数的选项,请参阅此
然后你可以在你的YAML:中定义它
some_field: _|arg_name|_
并像这样加载:
test_conf_yaml = PickleRick('./tests/placebos/test_config.yaml', arg_name='hallo world')
安装:
pip install pickle-rick
用途:
定义一个YAML或JSON字符串(或文件(。
BASIC:
text: test
dictionary:
one: 1
two: 2
number: 2
list:
- one
- two
- four
- name: John
age: 20
USERNAME:
type: env
load: USERNAME
callable_lambda:
type: lambda
load: "lambda: print('hell world!')"
datenow:
type: lambda
import:
- "from datetime import datetime as dd"
load: "lambda: print(dd.utcnow().strftime('%Y-%m-%d'))"
test_function:
type: function
name: test_function
args:
x: 7
y: null
s: hello world
any:
- 1
- hello
import:
- "math"
load: >
def test(x, y, s, any):
print(math.e)
iii = 111
print(iii)
print(x,s)
if y:
print(type(y))
else:
print(y)
for i in any:
print(i)
然后将其用作对象。
>> from pickle_rick import PickleRick
>> config = PickleRick('./config.yaml', deep=True, load_lambda=True)
>> config.BASIC.dictionary
{'one' : 1, 'two' : 2}
>> config.BASIC.callable_lambda()
hell world!
您可以定义Python函数,从其他文件或RESTAPI、环境变量加载额外的数据,然后再次将所有内容写入YAML或JSON。
当构建需要结构化配置文件的系统时,或者在笔记本电脑中作为交互式结构时,这种方法尤其有效。
使用此功能有一个安全注意事项。只加载受信任的文件,因为任何代码都可以执行,因此不要只加载任何内容,而不知道完整的内容是什么
该软件包名为PickleRick,可在以下位置获得:
- 文档