GVKun编程网logo

THINKPHP支持YAML配置文件的设置方法(thinkphp smarty)

17

本篇文章给大家谈谈THINKPHP支持YAML配置文件的设置方法,以及thinkphpsmarty的知识点,同时本文还将给你拓展PHP编程:ThinkPHP公共配置文件与各自项目中配置文件组合的方法、

本篇文章给大家谈谈THINKPHP支持YAML配置文件的设置方法,以及thinkphp smarty的知识点,同时本文还将给你拓展PHP编程:ThinkPHP公共配置文件与各自项目中配置文件组合的方法、PHP读取配置文件的类 php读取ini、yaml、xml配置文件信息、Python使用PyYAML库读写yaml配置文件、Python实现解析yaml配置文件的示例详解等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

THINKPHP支持YAML配置文件的设置方法(thinkphp smarty)

THINKPHP支持YAML配置文件的设置方法(thinkphp smarty)

为什么要用 yaml

因为 Yaml 简单,而且对人类友好;

Yaml:

在哪里会用到?

最基本的,在 ThinkPHP 的配置文件里面就可以选择 Yaml 的格式,你是愿意写 Yaml 的简洁格式配置呢?还是愿意写又长又臭又难写的 PHP array 呢?

问题来了

于是,我把配置格式改为 Yaml:

代码如下:
PHP

// 定义配置文件的格式为 yaml define('CONF_EXT','.yaml');

然后把 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公共配置文件与各自项目中配置文件组合的方法

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配置文件信息

PHP读取配置文件的类 php读取ini、yaml、xml配置文件信息

  1. /**
  2. * 功能:读取配置文件
  3. * 编辑:bbs.it-home.org
  4. * 最后修改:2013/10/11
  5. */
  6. class Settings {
  7. var $_settings = array();
  8. function get($var) {
  9. $var = explode(''.'', $var);
  10. $result = $this->_settings;
  11. foreach ($var as $key) {
  12. if (!isset ($result [$key])) {
  13. return false;
  14. }
  15. $result = $result [$key];
  16. }
  17. return $result;
  18. }
  19. function load() {
  20. trigger_error(''Not yet implemented'', E_USER_ERROR);
  21. }
  22. }
  23. class Settings_PHP extends Settings {
  24. function load($file) {
  25. if (file_exists($file) == false) {
  26. return false;
  27. }
  28. // Include file
  29. include ($file);
  30. unset ($file);
  31. // Get declared variables
  32. $vars = get_defined_vars();
  33. // Add to settings array
  34. foreach ($vars as $key => $val) {
  35. if ($key == ''this'')
  36. continue;
  37. $this->_settings [$key] = $val;
  38. }
  39. }
  40. }
  41. class Settings_INI extends Settings {
  42. function load($file) {
  43. if (file_exists($file) == false) {
  44. return false;
  45. }
  46. $this->_settings = parse_ini_file($file, true);
  47. }
  48. }
  49. class Settings_YAML extends Settings {
  50. function load($file) {
  51. if (file_exists($file) == false) {
  52. return false;
  53. }
  54. include (''spyc.php'');
  55. $this->_settings = Spyc::YAMLLoad($file);
  56. }
  57. }
  58. class Settings_XML extends Settings {
  59. function load($file) {
  60. if (file_exists($file) == false) {
  61. return false;
  62. }
  63. include (''xmllib.php'');
  64. $xml = file_get_contents($file);
  65. $data = XML_unserialize($xml);
  66. $this->_settings = $data [''settings''];
  67. }
  68. }
  69. ?>
复制代码


Python使用PyYAML库读写yaml配置文件

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配置文件的示例详解

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配置文件的示例详解的相关信息,可以在本站进行搜索。

本文标签: