THINKPHP支持YAML配置文件的设置方法(thinkphp smarty)
25-02-10
17
然后把 Application 目录下面的 config.PHP 全部改为 config.yaml。
这个时候,报错:
PHP\Common\functions.PHP LINE: 90
然后找,发现这一段:
一个数组
* @param string $file 配置文件名
* @return array
*/
if (!function_exists('yaml_parse_file')) {
function yaml_parse_file($file) {
vendor('spyc.Spyc');
return Spyc::YAMLLoad($file);
}
}
貌似引入 Spyc 这个库没找到。
找了一下,Spyc 在这里:
然后,这个 vendor 是什么东东?
看这里:
结论:
在上面的 Git 里面下载 Spyc.PHP 放进 /ThinkPHP/Library/vendor/spyc/ 目录下,就一切正常!Done with the right way!
PHP编程:ThinkPHP公共配置文件与各自项目中配置文件组合的方法 《ThinkPHP公共配置文件与各自项目中配置文件组合的方法》要点: 本文介绍了ThinkPHP公共配置文件与各自项目中配置文件组合的方法,希望对您有用。如果有疑问,可以联系我们。
本文实例讲述了ThinkPHP公共配置文件与各自项目中配置文件组合的办法.分享给大家供大家参考.具体实现办法如下:
在使用ThinkPHP时,在布局目录时,常使用的是单个入口文件对应一个项目目录,但是这样在写配置文件时,在各自的配置文件中,经常会使用重复的配置项,所用这时就会将公共的配置项放在一个公共的目录下.
具体实现办法:
使用配置文件的特性return array();可以在各自项目中的配置文件中这样定义:
代码如下:
$config = array(''=>'',); 然后使用函数return array_merge(include'./conf/config.PHP',$config);
这样就可以在最根目录下面使用公共的配置文件
希望本文所述对大家的ThinkPHP框架程序设计有所赞助.
《ThinkPHP公共配置文件与各自项目中配置文件组合的方法》是否对您有启发,欢迎查看更多与《ThinkPHP公共配置文件与各自项目中配置文件组合的方法》相关教程,学精学透。小编 jb51.cc为您提供精彩教程。
PHP读取配置文件的类 php读取ini、yaml、xml配置文件信息
/**
* 功能:读取配置文件
* 编辑:bbs.it-home.org
* 最后修改:2013/10/11
*/
class Settings {
var $_settings = array();
function get($var) {
$var = explode(''.'', $var);
$result = $this->_settings;
foreach ($var as $key) {
if (!isset ($result [$key])) {
return false;
}
$result = $result [$key];
}
return $result;
}
function load() {
trigger_error(''Not yet implemented'', E_USER_ERROR);
}
}
class Settings_PHP extends Settings {
function load($file) {
if (file_exists($file) == false) {
return false;
}
// Include file
include ($file);
unset ($file);
// Get declared variables
$vars = get_defined_vars();
// Add to settings array
foreach ($vars as $key => $val) {
if ($key == ''this'')
continue;
$this->_settings [$key] = $val;
}
}
}
class Settings_INI extends Settings {
function load($file) {
if (file_exists($file) == false) {
return false;
}
$this->_settings = parse_ini_file($file, true);
}
}
class Settings_YAML extends Settings {
function load($file) {
if (file_exists($file) == false) {
return false;
}
include (''spyc.php'');
$this->_settings = Spyc::YAMLLoad($file);
}
}
class Settings_XML extends Settings {
function load($file) {
if (file_exists($file) == false) {
return false;
}
include (''xmllib.php'');
$xml = file_get_contents($file);
$data = XML_unserialize($xml);
$this->_settings = $data [''settings''];
}
}
?>
复制代码
Python使用PyYAML库读写yaml配置文件
一. yaml文件介绍
yaml是一个专门用来写配置文件的语言。
1. yaml文件规则
区分大小写;
使用缩进表示层级关系;
使用空格键缩进,而非Tab键缩进
缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
注释标识为#
2. yaml文件数据结构
对象:键值对的集合(简称 "映射或字典")
键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
数组:一组按序排列的值(简称 "序列或列表")
数组前加有 “-” 符号,符号与值之间需用空格分隔
纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
None值可用null可 ~ 表示
二、python中读取yaml配置文件
1. 前提条件
python中读取yaml文件前需要安装pyyaml和导入yaml模块:
使用yaml需要安装的模块为pyyaml(pip3 install pyyaml);
导入的模块为yaml(import yaml)
2. 读取yaml文件数据
python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;
import yaml
import os
def get_yaml_data(yaml_file):
# 打开yaml文件
print("***获取yaml文件数据***")
file = open(yaml_file, ''r'', encoding="utf-8")
file_data = file.read()
file.close()
print(file_data)
print("类型:", type(file_data))
# 将字符串转化为字典或列表
print("***转化yaml数据为字典或列表***")
data = yaml.full_load(file_data)
print(data)
print("类型:", type(data))
return data
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "config.yaml")
get_yaml_data(yaml_path)
"""
***获取yaml文件数据***
# yaml键值对:即python中字典
usr: my
psw: 123455
类型:<class ''str''>
***转化yaml数据为字典或列表***
{''usr'': ''my'', ''psw'': 123455}
类型:<class ''dict''>
"""
3. yaml文件数据为键值对
(1)yaml文件中内容为键值对:
# yaml键值对:即python中字典
usr: my
psw: 123455
s: " abc\n"
python解析yaml文件后获取的数据:
{''usr'': ''my'', ''psw'': 123455, ''s'': '' abc\n''}
(2)yaml文件中内容为“键值对''嵌套"键值对"
# yaml键值对嵌套:即python中字典嵌套字典
usr1:
name: a
psw: 123
usr2:
name: b
psw: 456
python解析yaml文件后获取的数据:
{''usr1'': {''name'': ''a'', ''psw'': 123}, ''usr2'': {''name'': ''b'', ''psw'': 456}}
(3)yaml文件中“键值对”中嵌套“数组”
# yaml键值对中嵌套数组
usr3:
- a
- b
- c
usr4:
- b
python解析yaml文件后获取的数据:
{''usr3'': [''a'', ''b'', ''c''], ''usr4'': [''b'']}
4. yaml文件数据为数组
(1)yaml文件中内容为数组
# yaml数组
- a
- b
- 5
python解析yaml文件后获取的数据:
[''a'', ''b'', 5]
(2)yaml文件“数组”中嵌套“键值对”
# yaml"数组"中嵌套"键值对"
- usr1: aaa
- psw1: 111
usr2: bbb
psw2: 222
python解析yaml文件后获取的数据:
[{''usr1'': ''aaa''}, {''psw1'': 111, ''usr2'': ''bbb'', ''psw2'': 222}]
5. yaml文件中基本数据类型:
# 纯量
s_val: name # 字符串:{''s_val'': ''name''}
spec_s_val: "name\n" # 特殊字符串:{''spec_s_val'': ''name\n''
num_val: 31.14 # 数字:{''num_val'': 31.14}
bol_val: true # 布尔值:{''bol_val'': True}
nul_val: null # null值:{''nul_val'': None}
nul_val1: ~ # null值:{''nul_val1'': None}
time_val: 2018-03-01t11:33:22.55-06:00 # 时间值(iso8601格式):{''time_val'': datetime.datetime(2018, 3, 1, 17, 33, 22, 550000)}
date_val: 2019-01-10 # 日期值:{''date_val'': datetime.date(2019, 1, 10)}
6. yaml文件中引用
yaml文件中内容
animal3: &animal3 fish
test: *animal3
python读取的数据
{''animal3'': ''fish'', ''test'': ''fish''}
三、python中读取多个yaml文档
1. 多个文档在一个yaml文件,使用 --- 分隔方式来分段
如:yaml文件中数据
# 分段yaml文件中多个文档
---
animal1: dog
age: 2
---
animal2: cat
age: 3
2. python脚本读取一个yaml文件中多个文档方法
python获取yaml数据时需使用load_all函数来解析全部的文档,再从中读取对象中的数据
# yaml文件中含有多个文档时,分别获取文档中数据
def get_yaml_load_all(yaml_file):
# 打开yaml文件
file = open(yaml_file, ''r'', encoding="utf-8")
file_data = file.read()
file.close()
all_data = yaml.full_load_all(file_data)
for data in all_data:
print(data)
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "config.yaml")
get_yaml_load_all(yaml_path)
"""结果
{''animal1'': ''dog'', ''age'': 2}
{''animal2'': ''cat'', ''age'': 3}
"""
四、python对象生成yaml文档
通过yaml.dump()方法将列表或字典数据进行转化yaml标准模式
# 将python对象生成yaml文档
import yaml
def generate_yaml_doc(yaml_file):
py_object = {''school'': ''zhang'',
''students'': [''a'', ''b'']}
file = open(yaml_file, ''w'', encoding=''utf-8'')
yaml.dump(py_object, file)
file.close()
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc(yaml_path)
"""结果
school: zhang
students:
-a
-b
"""
PS: 在网上看到很多教程中都说pyyaml库写yaml文件结果不是标准的yaml格式,但是经过我个人测试后发现并没有这方面的问题,因此, ruamel 模块就不再介绍了。本人测试的环境是python 3.7,PyYAML 5.1.2。
Python实现解析yaml配置文件的示例详解
楔子
前面我们介绍了 ini 格式的配置文件,本次来看看 yaml,它的表达能力相比 ini 更加的强大。yaml 文件以 .yml 结尾,在介绍它的语法结构之前我们先来看看 yaml 的一些基本规则。
大小写敏感; 使用缩进表示层级关系,并且缩进只能用空格、不可以使用 tab 键。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可; # 表示注释,# 到行尾的所有字符都会被忽略;
yaml 支持的数据结构有以下三种:
字典:键值对的集合; 数组:多个元素组成的集合; 标量:单个、不可分割的值;
Python 解析 yaml 则是通过一个名为 pyyaml 的库,直接 pip install pyyaml 即可。
下面我们来介绍一下 yaml 的数据结构。
字典
类似于 Python 的字典,使用键值对表示:
name: satori
# 或者写成下面的形式
{name: satori}
Python 解析之后会是什么结果呢?
import yaml
config = """
name: satori
"""
# yaml.safe_load:只解析自己信任的输入
# yaml.unsafe_load:不检测输入的安全性
print(yaml.safe_load(config))
"""
{''name'': ''satori''}
"""
config = """
{name: satori}
"""
print(yaml.safe_load(config))
"""
{''name'': ''satori''}
"""
在 yaml 里面,字典的 value 也可以是一个字典:
info: {name: satori, address: 东方地灵殿}
Python 解析的结果如下:
import yaml
config = """
info: {name: satori, address: 东方地灵殿}
"""
print(yaml.safe_load(config))
"""
{
''info'': {''name'': ''satori'',
''address'': ''东方地灵殿''}
}
"""
还是很简单的。
数组
一组连字符开头的行,构成一个数组。
- 古明地觉
- 古明地恋
- 雾雨魔理沙
# - 后面要有空格
# 或者写成下面的形式
[古明地觉, 古明地恋, 雾雨魔理沙]
Python 解析的结果如下:
import yaml
config = """
- 古明地觉
- 古明地恋
- 雾雨魔理沙
"""
print(yaml.safe_load(config))
"""
[''古明地觉'', ''古明地恋'', ''雾雨魔理沙'']
"""
config = """
[古明地觉, 古明地恋, 雾雨魔理沙]
"""
print(yaml.safe_load(config))
"""
[''古明地觉'', ''古明地恋'', ''雾雨魔理沙'']
"""
并且数组的子成员也可以是一个数组:
- - 古明地觉 - 古明地恋 - 雾雨魔理沙
Python 解析的结果如下:
import yaml
config = """
-
- 古明地觉
- 古明地恋
- 雾雨魔理沙
"""
print(yaml.safe_load(config))
"""
[[''古明地觉'', ''古明地恋'', ''雾雨魔理沙'']]
"""
# 更简洁的写法
config = """
- [古明地觉, 古明地恋, 雾雨魔理沙]
"""
print(yaml.safe_load(config))
"""
[[''古明地觉'', ''古明地恋'', ''雾雨魔理沙'']]
"""
显然数组也可以放在字典中:
# 缩进对应的空格数没有要求,但是必须一样
# 对于当前这个键值对而言也可以没有缩进
girl:
- 古明地觉
- 古明地恋
- 雾雨魔理沙
# 或者下面这种形式
girl: [古明地觉, 古明地恋, 雾雨魔理沙]
# 或者下面这种形式
{girl: [古明地觉, 古明地恋, 雾雨魔理沙]}
Python 解析的结果如下:
import yaml
config = """
girl:
- 古明地觉
- 古明地恋
- 雾雨魔理沙
"""
print(yaml.safe_load(config))
"""
{''girl'': [''古明地觉'', ''古明地恋'', ''雾雨魔理沙'']}
"""
# 注意:上面的 girl 对应的是数组
# 因为每个元素前面都有 -
# 但如果没有的话会发生什么?
config = """
girl:
古明地觉
古明地恋
雾雨魔理沙
"""
print(yaml.safe_load(config))
"""
{''girl'': ''古明地觉 古明地恋 雾雨魔理沙''}
"""
# 我们看到整体相当于是一个字符串
# 类似于 html,之间用一个空格代替
# 因此如果内容比较长,我们可以写成多行
# 但是注意:每一行前面必须有空格
然后是一个稍微复杂的例子:
import yaml
config = """
girl:
# 会对应一个数组
- 古明地觉
- 古明地恋
- 雾雨魔理沙
place1:
# 虽然不是数组,但是内部是字典的形式
# 所以会对应一个含有三个键值对的字典
古明地觉: 东方地灵殿
古明地恋: 东方地灵殿
雾雨魔理沙: 魔法森林
place2:
# 是数组,数组里面每个元素是一个字典
- 古明地觉: 东方地灵殿
- 古明地恋: 东方地灵殿
- 雾雨魔理沙: 魔法森林
"""
print(yaml.safe_load(config))
"""
{
''girl'': [''古明地觉'', ''古明地恋'', ''雾雨魔理沙''],
''place1'': {''古明地觉'': ''东方地灵殿'',
''古明地恋'': ''东方地灵殿'',
''雾雨魔理沙'': ''魔法森林''},
''place2'': [{''古明地觉'': ''东方地灵殿''},
{''古明地恋'': ''东方地灵殿''},
{''雾雨魔理沙'': ''魔法森林''}]
}
"""
place1 对应的是一个字典,place2 对应的是一个数组。
标量
标量属于最基本的、不可再分的值,比较简单,我们就全部都说了吧。
import yaml
config = """
int: 123
float: 3.14
bool:
- true
- false
# 波浪号表示空
NoneType: ~
datetime: 2020-11-11 12:12:13
# 使用两个 ! 可以进行类型强转
# 不过几乎用不到
cast:
- !!str 123
- !!str true
"""
print(yaml.safe_load(config))
"""
{
''int'': 123, ''float'': 3.14,
''bool'': [True, False], ''NoneType'': None,
''datetime'': datetime.datetime(2020, 11, 11, 12, 12, 13),
''cast'': [''123'', ''true'']
}
"""
这里可能有人已经发现了,就是字符串不需要加引号,但如果里面有特殊字符怎么办?所以 yaml 是支持使用引号括起来的。
import yaml
config = """
name1: 古明地觉 a x $ # !!
name2: "古明地觉 a x $ # !!"
name3: ''古明地觉 a x $ # !!''
"""
print(yaml.safe_load(config))
"""
{''name1'': ''古明地觉 a x $'',
''name2'': ''古明地觉 a x $ # !!'',
''name3'': ''古明地觉 a x $ # !!''}
"""
对于 yaml 而言,字符串默认是从第一个不是空格的字符、匹配到最后一个不是空格的字符(如果遇到 # 直接停止)。因此如果 value 的前面或后面有空格的话,那么这些空格是不会显示的,或者当中有 #,那么 # 后面的内容也不会显示。
解决办法是使用单引号或双引号括起来,如果内部还有引号,那么需要输入两遍进行转义(如果内部的引号和外面括起来的引号相同的话)。
引用
对于 yaml 而言,还支持我们采用 & 和 * 进行引用,举个例子:
import yaml
config = """
# 多了一个 &db_info_ref
# 相当于起了个名字,叫 db_info_ref
db_info: &db_info_ref
host: 127.0.0.1
port: 5432
user: postgres
password: 123456
deploy:
os: Linux
# 将内容直接扔到里面来
<<: *db_info_ref
"""
print(yaml.safe_load(config))
"""
{
''db_info'': {''host'': ''127.0.0.1'',
''port'': 5432,
''user'': ''postgres'',
''password'': 123456},
''deploy'': {''host'': ''127.0.0.1'',
''port'': 5432,
''user'': ''postgres'',
''password'': 123456,
''os'': ''Linux''}
}
"""
& 用来建立锚点,<< 表示合并当前数据,* 表示用来引用锚点。还可以作用在数组中:
import yaml
config = """
- &name 古明地觉
- 古明地恋
- 雾雨魔理沙
- *name
"""
print(yaml.safe_load(config))
"""
[''古明地觉'', ''古明地恋'',
''雾雨魔理沙'', ''古明地觉'']
"""
生成 yaml 文件
既然能够读取 yaml 文件,那么自然也能生成 yaml 文件。
import yaml
data = {
"girl": [
{"name": "古明地觉", "age": 17, "place": "东方地灵殿"},
{"name": "古明地恋", "age": 16, "place": "东方地灵殿"},
{"name": "雾雨魔理沙", "age": 16, "place": "魔法森林"}
],
"other": {
"古明地觉": {"nickname": ["小五", "少女觉", "觉大人", "小五萝莉"],
"length": 155},
"古明地恋": {"nickname": ["恋恋"], "length": 155},
"雾雨魔理沙": {"nickname": ["摸你傻"], "length": 155}
}
}
with open("cfg.yml", "w", encoding="utf-8") as f:
yaml.dump(data, f, allow_unicode=True, indent=2)
然后我们看看生成的 yml 文件长什么样子。
我们来看 yml 文件,然后反推出相应的数据结构。首先整体是一个字典,里面有 girl 和 other 两个 key。其中 girl 对应一个数组,数组里面每个元素都是字典,这是符合预期的。
然后 other 对应一个字典,而且这个字典内部有三个键值对,key 分别是:古明地觉、古明地恋、雾雨魔理沙,各自对应的 value 又是一个字典(内部有 length、nickname 两个 key,length 对应整型、nickname 对应列表)。
最后再看一个本人之前项目中的 yml 文件,可以猜猜看解析出来长什么样子。
解析一下看看和你想的是不是一样的。
import yaml
with open(".gitlab-ci.yml", "r", encoding="utf-8") as f:
data = f.read()
data = yaml.safe_load(data)
print(data)
"""
{
''stages'': [''test''],
''cache'': {''key'': ''${CI_COMMIT_REF_SLUG}'',
''paths'': [''.cache/pip'']},
''variables'': {''PIP_CACHE_DIR'': ''$CI_PROJECT_DIR/.cache/pip''},
''test'': {''stage'': ''test'',
''image'': ''xxxxxxx/python:3.8.1-thanosclient-buster'',
''only'': [''branches'', ''tags''],
''services'': [''mysql:5.7''],
''variables'': {''PROJECT'': ''XXXXXX'',
''PIP_CACHE_DIR'': ''$CI_PROJECT_DIR/.cache/pip'',
''MARKETING_CONFIG'': ''config/room/ci.cn-gz.toml'',
''MYSQL_DATABASE'': ''activity'',
''MYSQL_ROOT_PASSWORD'': ''password'',
''MYSQL_INITDB_SKIP_TZINFO'': ''1''}
}
}
"""
结果应该不难想,毕竟 yaml 文件不是很复杂。
以上就是Python实现解析yaml配置文件的示例详解的详细内容,更多关于Python解析yaml配置文件的资料请关注其它相关文章!
您可能感兴趣的文章: python解析yaml文件过程详解 Python3操作YAML文件格式方法解析 Python基于yaml文件配置logging日志过程解析 使用 Python 解析配置文件格式 Python实现解析ini配置文件的示例详解
我们今天的关于THINKPHP支持YAML配置文件的设置方法 和thinkphp smarty 的分享就到这里,谢谢您的阅读,如果想了解更多关于PHP编程:ThinkPHP公共配置文件与各自项目中配置文件组合的方法、PHP读取配置文件的类 php读取ini、yaml、xml配置文件信息、Python使用PyYAML库读写yaml配置文件、Python实现解析yaml配置文件的示例详解 的相关信息,可以在本站进行搜索。