PyYAML - 将字典转储到文件时跳过某些键
PyYAML - Skipping certain keys when dumping a dict to file
我有一个 YAML 文件,其中包含我的应用程序的配置数据,只要应用程序 运行 出于调试目的,它就会被转储到一个新文件中。不幸的是,YAML 文件中的一些密钥包含敏感数据,需要进行混淆或简单地从转储文件中排除。
示例 YAML 输入文件:
logging_config:
level: INFO
file_path: /path/to/log_file.log
database_access:
table_to_query: customer_table
database_api_key: XXX-XXX-XXX # Sensitive data, exclude from archived file
当然有变通办法:
- 在将敏感数据输出到 YAML 之前保留包含敏感数据的键列表和预处理指令
- 在单独的配置文件中分离敏感和非敏感数据并仅输出后者
- 等等
但我希望有一个类似于实现自定义 Loader
的解决方案,只要它出现在 dict 值中就对 !keep_secret
这样的命令做出反应,因为它会使我的配置文件更多可读。
您可以使用自定义代表。这是一个基本示例:
import yaml
class SensitiveText:
def __init__(self, content):
self.content = content
def __repr__(self):
return self.content
def __str__(self):
return self.content
def sensitive_text_remover(dumper, data):
return dumper.represent_scalar("tag:yaml.org,2002:null", "")
yaml.add_representer(SensitiveText, sensitive_text_remover)
data = {
"logging_config": {
"level": "INFO",
"file_path": "/path/to/log_file.log"
},
"database_access": {
"table_to_query": "customer_table",
"database_api_key": SensitiveText("XXX-XXX-XXX")
}
}
print(yaml.dump(data))
这会打印:
database_access:
database_api_key:
table_to_query: customer_table
logging_config:
file_path: /path/to/log_file.log
level: INFO
您当然可以为 database_access
使用 class,而不是使用完全删除 database_api_key
的表示器。
我有一个 YAML 文件,其中包含我的应用程序的配置数据,只要应用程序 运行 出于调试目的,它就会被转储到一个新文件中。不幸的是,YAML 文件中的一些密钥包含敏感数据,需要进行混淆或简单地从转储文件中排除。
示例 YAML 输入文件:
logging_config:
level: INFO
file_path: /path/to/log_file.log
database_access:
table_to_query: customer_table
database_api_key: XXX-XXX-XXX # Sensitive data, exclude from archived file
当然有变通办法:
- 在将敏感数据输出到 YAML 之前保留包含敏感数据的键列表和预处理指令
- 在单独的配置文件中分离敏感和非敏感数据并仅输出后者
- 等等
但我希望有一个类似于实现自定义 Loader
的解决方案,只要它出现在 dict 值中就对 !keep_secret
这样的命令做出反应,因为它会使我的配置文件更多可读。
您可以使用自定义代表。这是一个基本示例:
import yaml
class SensitiveText:
def __init__(self, content):
self.content = content
def __repr__(self):
return self.content
def __str__(self):
return self.content
def sensitive_text_remover(dumper, data):
return dumper.represent_scalar("tag:yaml.org,2002:null", "")
yaml.add_representer(SensitiveText, sensitive_text_remover)
data = {
"logging_config": {
"level": "INFO",
"file_path": "/path/to/log_file.log"
},
"database_access": {
"table_to_query": "customer_table",
"database_api_key": SensitiveText("XXX-XXX-XXX")
}
}
print(yaml.dump(data))
这会打印:
database_access:
database_api_key:
table_to_query: customer_table
logging_config:
file_path: /path/to/log_file.log
level: INFO
您当然可以为 database_access
使用 class,而不是使用完全删除 database_api_key
的表示器。