在 Python1024 的根底篇中,咱们曾经介绍过文件治理和文本文件的读写。
在门路解决方面,Python3.6 版本后,倡议采纳 pathlib,它采纳面向对象封装接口,应用起来比 os.path 更人性化。
在学习后续章节前,有必要先介绍几个根本的概念,不便后续的了解。
1、常见文件格式
文本文件其实是一种非凡的二进制文件,它约定了以字符格局的读取形式,字符合乎 ASCII 或 UNICODE 等编码标准。因为文本文件太通用、太非凡(字符模式)了,咱们把它独自列出看待。
其余二进制文件则随利用的不同,有各式各样的读写规定。比方:
- PDF(Portable Document Format)文件,定义了一种独立于应用程序、硬件、操作系统的形式出现文档的文件格式。它外部蕴含了大量类型的子元素,通过索引的形式嵌入在不同的地位。只有合乎其标准的软件,能力读取,甚至批改 PDF 文件。PDF 文件格式规范由 Adobe 定义:参考官网。
- 微软 2007 版本之后的 Office 文件,比方 docx、pptx、xlsx,属于 OpenXML 文件格式。它是由微软开发的基于 XML 和 ZIP 压缩技术的文件标准,并于 2008 年正式成为国际标准。能够用解压缩软件关上这类文件,就能看到其内部结构。目前除了微软 Office 软件,咱们也能够通过金山 WPS、OpenOffice 等软件关上其文档。
- 图像文件的格局十分多,依据压缩算法不同,会设计不同的文件格式,比方:JPEG、TIFF、RAW、BMP、GIF、PNG。归根到底,图像代表的是色调数据,是整块的内容,而形容其数据结构的,是文件头部信息。
- 音频文件,保留的是声音信号的数字化,和图像一样,文件不同次要源于压缩算法的不同。咱们常见的音频文件格局如:MP3、WAV、AAC、FLAC 等,声音信号被数字化后保留在数据块中,同时由文件头形容数据块。要害信息如采样率、比特率、声道数。采样率是工夫相干的概念,即每秒收集多少次声音样本信息。
- 视频文件,保留的是图像和音频的合集,即视频文件能够拆分为视频和音频,其中视频是图像的合集,每秒钟有多少张图像,就是它的 FPS 帧率,帧率决定了视频的晦涩度。此外,每张图像的分辨率多大,决定了它的清晰度,比方咱们常说的 720P 代表 1280×720 的分辨率,1080P 就是 1920×1080 的分辨率,即代表用 1920×1080 个像素点来表白一张图片信息。所以,视频文件尤其大,依据压缩算法的不同,常见的文件格式如:MP4、MOV、FLV、WMV、WEBM 等。
当然,除了下面这些文件格式外,咱们还能够定义本人的格局,只有定义的格局,能被对应软件反对关上和写入即可。换句话说,如果你定义的文件格式,没人写出软件去反对,那就没方法利用。或者,你本人写了软件,但大部分人都不晓得,或不想用,那它也就丢失了利用价值。在软件行业向互联网演进过程中,淘汰了大量的软件,才诞生出目前绝对稳固的互联网基础设施。
Youtube 上有人做了一个视频,出现了 90 年代到 2020 年间最受欢迎浏览器的更替:原地址。
2、文本文件也有分类
文本文件,实质上是用于存储字符的文件。
所有那些以字符保留的文件格式,其实都是文本文件,只不过文本内容还有额定特定含意。
常见的比方:CSV、HTML、XML、JSON、JS、CSS,还有各种语言的代码。
2.1 CSV 文件
CSV 文件罕用于保留数据表格,比方:
姓名, 电话, 地址
张三, 18900000001, 上海
李四, 13800000002, 广州
这就是一个典型的 CSV 文件,咱们能够用文本编辑器关上它,也能够用 Excel 等软件关上它。如果用 Excel 软件关上它,Excel 会把英文逗号作为分隔符号,提取单元格内容,咱们看到的就是一张表格。
Python 同样也反对这类文件的读写,通过 csv 模块:
import pathlib
import csv
path = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic')
csv_path = path.joinpath('hello.csv')
with open(csv_path ,'r') as f:
f_csv = csv.reader(f)
headers = next(f_csv)
for row in f_csv:
for h, v in zip(headers, row):
print(f'{h.strip()}: {v.strip()}')
这样就能读出 CSV 文件中的数据:
姓名: 张三
电话: 18900000001
地址: 上海
姓名: 李四
电话: 13800000002
地址: 广州
2.2 XML 文件
XML(eXtensible Markup Language)是为了结构化存储和传输数据而生,是一种标记语言。
<?xml version="1.0" encoding="UTF-8"?>
<mail>
<to>World</to>
<from> 程一初 </from>
<title>Hello World</title>
<body>Welcome to Python1024!</body>
</mail>
咱们能够自定义标记,一种定义就是一种数据格式。在 Python 中,有三种解决数据的形式:
- DOM(Document Object Model):文档对象模型,是 W3C 组织举荐的规范编程接口。它把 XML 文件映射到内存中,以“树”的数据结构来操作数据。
- SAX(simple API for XML):事件驱动模型,尽管不是规范,但利用宽泛。它逐行扫描文档,边扫边解析,这样就不必一下子全装载到内存了。
- ElementTree:性能介乎于 DOM 和 SAX 之间,应用门槛低。
以 ElementTree 为例:
import pathlib
import xml.etree.ElementTree as ET
path = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic')
xml_path = path.joinpath('hello.xml')
tree = ET.parse(xml_path)
root = tree.getroot() # 根节点
print('root_tag:', root.tag) # 根标签:mail
for elem in root:
print(f'{elem.tag}: {elem.text}')
此外,HTML 是 XML 的一个子集,即 HTML 是一种非凡的 XML,它定义了一整套标签标准,比方文字、超链接、表单等,依照这套标准来出现 HTML 的利用就是浏览器了。当然,浏览器除了反对 HTML,还须要反对 JS 脚本、CSS 款式文件等其余标准。
2.3 JSON 文件
相比 XML 文件格式,JSON 文件格式更精简。同样的信息能够用更少的字符示意:
{
"mail": {
"to": "World",
"from": "程一初",
"title": "Hello World",
"body": "Welcome to Python1024!"
}
}
少了对称标记以及 <> 符号,JSON 须要占用更少标记数据,所以它更常被用于互联网利用的数据传输。Python 也内置了解决模块 json:
import pathlib
import json
path = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic')
json_path = path.joinpath('hello.json')
with open(json_path, 'r') as f:
data = json.loads(f.read())
print(f'root_tag: {list(data.keys())[0]}')
for k, v in data['mail'].items():
print(f'{k}: {v}')
2.4 代码文件
代码文件,比方 Python 代码文件,也是一种文本文件。所以,有一些动态代码检测工具,如 pylint、pep8、flake8 等,能够读取代码文件后查看编写品质。甚至,你能够编写程序主动生成代码,在自动化测试中用的比拟多。
代码文件的读取和其余文本文件一样,都能够用 open() 函数关上,然而要解析代码文件,就必须用“语法树”来解析,它也提供了对应的 ast 模块。比方咱们写一个简略的 Python 代码文件,蕴含一个正文块,以及一行代码:
'''Author: 程一初'''
print('hello world!')
而后用语法树解析它:
import pathlib
import ast
path = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic')
py_path = path.joinpath('hello.py')
with open(py_path, 'r') as f:
node = ast.parse(f.read())
# 获取文档正文
print(ast.get_docstring(node))
class MyVisitor(ast.NodeVisitor):
# 定义一个遍历代码节点的类
# 按需重定义 generic_visit 函数
def generic_visit(self, node):
print(node)
super(MyVisitor, self).generic_visit(node)
v = MyVisitor()
v.visit(node)
会失去这样的后果:
Author: 程一初
<_ast.Module object at 0x118e4e890>
<_ast.Expr object at 0x118ce1b50>
<_ast.Str object at 0x118ce1f90>
<_ast.Expr object at 0x118ce1d90>
<_ast.Call object at 0x118ce1ad0>
<_ast.Name object at 0x118ce1b10>
<_ast.Load object at 0x103ed39d0>
<_ast.Str object at 0x118eb3ed0>
第一行为正文文档,剩下 8 行为 ast 外部对象,包含模块、表达式、字符串、函数名、调用等。这里只是举个例子,阐明代码文件也是一种非凡的文本文件。平时利用中,咱们简直不会这么去读写代码文件,而是间接用 Python 解释器来执行代码。
总结
理解什么是文件,就能明确每个文件都有本人的标准,想要解决某类文件,就得先找到符合规范的利用,或者模块。找到模块后,就能够通过结构化的代码来批量解决了。
常见的自动化解决无非就这几种:
- 批量文件解决,比方某个文件夹下的所有文件对立重命名;
- 依据提前设定的规定,主动分类解决文件,比方按文件后缀调用不同程序处理;
- 组成流水线:把反复的工作提炼出规范,把每一步程序化后再组装起来。
Python 的魅力,就是能把所有反复的工作,按模块组织起来,造成流水线,一个人施展 N 集体的效率。
Python1024 主动办公系列,涵盖 Python 解决文本文件、PDF、Word、Excel、PPT、图像、音频、视频、邮件、企业办公机器人等职场办公实用场景。