pyyaml的使用
版本控制:
python3.6.8
pyyaml 5.1
安装方法:
pip install pyyaml
今天按照网上的代码使用pyyaml模块时,报了警告:
YAMLLoadWarning: calling yaml.load() without Loader=… is deprecated,
as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
于是就去官网看了官方说明
在pyyaml5.1版本前,yaml.load方法可以调用任何python函数,包括一些系统指令,这是非常不安全的,因此yaml.load方法新加了一个入参’loader’
解决上述warning的两个办法:
1.如果你不是代码的开发者,可以在PythonWarning环境变量中加入以下指令
PYTHONWARNINGS=ignore::yaml.YAMLLoadWarning
2.如果你是代码的开发者,那么最好在yaml.load方法中,加上’loader’参数
yaml.load(input, Loader=yaml.FullLoader)
一共有四种loader
BaseLoader 载入大部分的基础YAML
SafeLoader 载入YAML的子集,推荐在不可信的输入时使用
FullLoader 这是默认的载入方式,载入全部YAML
UnsafeLoader 老版本的载入方式
3.作为开发者,你还可以用一个全局变量来忽略该warning
yaml.warnings({'YAMLLoadWarning': False})
yaml文件的读写
yaml_dict = {
"user_name":"zcc",
"birthday":"2019-3-28",
"gender":1,
"address":"杭州"
}
with open (os.path.join(yaml_dir,file_name),'w',encoding='utf-8') as f:
yaml.dump(yaml_dict,f)
我在指定的目录创建了一个yaml文件,虽然在写文件时指定了编码为utf-8,但查看文件内容时中文还是不能正常显示。不过并不影响之后的读取。
with open (yaml_file,'r',encoding='utf-8') as f:
yaml_dict = yaml.load(f,Loader=yaml.FullLoader)
print(yaml_dict["user_name"])
print(yaml_dict["address"])
用yaml.load方法载入了yaml文件后,就能像字典一样使用了。
另外,看到网上有博客误导大家,说pyyaml写的yaml文件,不支持复杂的结构(字典嵌套字典)。亲测pyyaml完全支持字典嵌套字典的写法:
yaml_dict = {
"user_name":"zcc",
"birthday":"2019-3-28",
"gender":{
"a":1,
"b":2,
},
"address":"杭州"
}
with open (os.path.join(yaml_dir,file_name),'w',encoding='utf-8') as f:
yaml.dump(yaml_dict,f)
生成的yaml文件内容:
address: "\u676D\u5DDE"
birthday: 2019-3-28
gender:
a: 1
b: 2
user_name: zcc