Python一秒搭建ftp服务器,帮助你在局域网共享文件

年轻人的状态
年轻人的状态

有多少人和这张图一样,每天清晨起床时,都后悔昨晚不该熬夜,决定以后晚上早点睡觉。结果到了晚上,照样一副 欲上九天揽月,下四海捉鳖的精神面貌...

习大大的关怀

可转眼一想,如果我不熬夜,就得不到习大大的关怀,辣怎么行?接着熬夜写文章吧!

pythonic的标记语言

之前总结过一篇关于小数据存储文件大比拼,当时着重介绍了json,因为它在各类编程语言的通用性较强。但今天,我想给大家介绍一款更加适合pythoner使用的语言Yaml。

YAML是一个可读性高,用来表达数据序列化的格式。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

之所以说它更适合pythoner使用,是因为Yaml在很多方面都与python语言神似。

特点 Yaml Python
使用#进行注释
区分大小写
大小写敏感
使用缩进表示层级关系
缩进格式 使用空格键缩进,而非Tab键缩进。
空格数目不固定,只需要相同层级保持一致
使用四个空格作为缩进(不推荐使用tab)

让我们再来看看Yaml的数据类型:

  1. 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  2. 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  3. 纯量(scalars):单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期

介绍了这么多,让我们先来一起学习下Yaml的语法...

Yaml语法学习

下面我们针对Yaml的集中类型,进行逐一学习。需要注意的是,Yaml的结构标识符前无需添加空格,但标识符后需要添加一个空格,比如:

# 数组横杠后添加空格...
- Java
- python
# 对象冒号后添加空格...
name: Uranus
数组

之所以先介绍数组,是因为这个数据类型最简单...

# 推荐
codes:
- Java
- Python
- Ruby

# 也可以
codes: [Java,Python,Ruby]
对象
# 推荐
name: Uranus

# 也可以
info: {name: Uranus}
纯量

我们需要明确纯量的定义:单个的,不可拆分的值,这句话尤为重要。
纯量默认是无需添加引号的,但正如上面说的,当它可能出现被拆分的情况时,我们需要将它放在引号中。
引号的使用类似Linux,单引号和双引号都可以使用,双引号不会对特殊字符转义。
下面集中列举可能出现的情况:

# 一般字符串,无需引号
name: Uranus

# 数值
age: 18

# 布尔值
result: true

# 时间格式
time: 2019-09-03t01:00:05
date: 2019-09-03

# 强制转型时,使用两个叹号
age: !!str 18
--> { age: '18' }

# 当存在空格等特殊字符时,需要添加引号
name: 'King Uranus'
name1: 'My name is :King Uranus'
# 单引号转义,所以出现\\n,双引号不转义
name2: 'My name is :\nKing Uranus'
--> { name: 'My name is \\nKing Uranus'}

name3: "My name is :\nKing Uranus"
--> { name: 'My name is \nKing Uranus'}

# yaml允许换行,但在第二行首位置,需要至少添加一个空格
name2: 话说到一半
   喘口气...
--> { name2: '话说到一半 喘口气...' }

# 表示空值null的几种方法
var:  
var1: null
var2: ~
--> { var: null, var1: null, var2: null }

关于引用

Yaml支持数据集之间的引用,&用来建立锚点(defaults),<<表示合并到当前数据,*用来引用锚点。

xiaoming: &info
  age: 18
  sex: male

xiaoli:
  <<: *info

--> { xiaoming: { age: 18, sex: 'male' },xiaoli: { age: 18, sex: 'male' } }
Python使用Yaml

写了这么多Yaml的知识,可Python怎么能与Yaml进行交互呢?使用Pyyaml。
安装: pip install pyyaml
导入: import yaml
至于操作,简直不要太简单... yaml只有两个方法load、dump,而且使用完全和json模块一样。但真的如此吗?显然不是...

Yaml安全告警

由于Yaml数据存在安全隐患,在使用pyyaml进行load时,会给出提示:

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please
read https://msg.pyyaml.org/load for full details.
所以我们有以下方式解决:

  • 添加Loader
    info = yaml.load(data,Loader=yaml.SafeLoader)
  • 使用语法糖
    info = yaml.safe_load(data)
Yaml文件特性

由于Yaml文件可以使用三个短横杠 --- 在一个文件中保存多个Yaml文档内容,所以Yaml的方法额外多出了load_all dump_all两种方法。但这里有个问题,如果使用load_all加载单个文档,没有问题,但如果使用load加载多个文档,则会提示:

yaml.composer.ComposerError: expected a single document in the stream but found another document

所以,无脑的简单粗暴,直接使用load_all与dump_all。当然,如果为了写着练习,可以判断文件后,单文件返回dict,如果多文件将迭代器转化为list后进行返回...

示例

未能能让大家更多的熟悉方法,我们就写一个没什么用的Yaml单文件与多文件解析器吧。
先拷贝上面的示例,编写两个简单的yaml文件:
breeze_single.yaml

---
xiaoming: &info
  age: 18
  sex: male

xiaoli:
  <<: *info

breeze.yaml

---
xiaoming: &info
  age: 18
  sex: male

xiaoli:
  <<: *info

---

codes:
- Java
- Python
- Ruby

time: 2019-09-03t01:00:05
date: 2019-09-03

现在让我们解析打印这两个yaml,最终再回写两个new_xxx的yaml文件吧。

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @WeChat   : King_Uranus
# @公众号    : 清风Python
# @Date     : 2019/9/3 0:46
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : PythonYaml.py

import yaml
from yaml.composer import ComposerError


class YamlLoader:
    def __init__(self, file):
        self.file = file

    def load_choice(self):
        with open(self.file, 'r') as f:
            data = f.read()
        try:
            return yaml.safe_load(data)
        except ComposerError:
            return yaml.safe_load_all(data)

    def file_load(self):
        info = self.load_choice()
        print(info)
        if isinstance(info, dict):
            self.file_dump(info, single=True)
        else:
            self.file_dump(info)

    def file_dump(self, data, single=None):
        with open('new_{}'.format(self.file), 'w', encoding='utf-8') as f:
            if single:
                f.write(yaml.safe_dump(data))
            else:
                f.write(yaml.safe_dump_all(data))


yaml_read_single = YamlLoader('breeze_single.yaml')

yaml_read_single.file_load()

yaml_read = YamlLoader('breeze.yaml')

yaml_read.file_load()


output:
>>> {'xiaoming': {'age': 18, 'sex': 'male'}, 'xiaoli': {'age': 18, 'sex': 'male'}}
>>> <generator object load_all at 0x0000000009E76DE0>

# new_breeze.yaml
xiaoli:
  age: 18
  sex: male
xiaoming:
  age: 18
  sex: male
---
codes:
- Java
- Python
- Ruby
date: 2019-09-03
result: true
time: 2019-09-03 01:00:05

# new_breeze_single.yaml
xiaoli:
  age: 18
  sex: male
xiaoming:
  age: 18
  sex: male

可以看到,读写都没有问题,但yaml将我们之前的引用,进行了重写...但无伤大雅。

The End

期待你关注我的公众号清风Python,如果你觉得不错,希望能动动手指转发给你身边的朋友们。
我的github地址:https://github.com/BreezePython

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341