使用 Python 对各种文件类型进行操作的相关实践。如:
csv:【标准库】支持逗号分隔值格式直接读取和写入文件,一般用于数据库或 excel。csvkit:用于转换和操作 CSV 的工具。
XML:XML 格式解析。xmltodict:致力于将 XML 变得像 JSON。
json:【标准库】json 编码与解码器pickle:【标准库】Python 特有的序列化对象的标准方式。BSON:short for Binary JSON:JSON 的二进制序列化编码格式pyyaml:yaml 格式文件操作struct:【标准库】处理不定长度的二进制记录格式io:【标准库】处理流的核心工具shelve:【标准库】Python 对象持久化。简单的数据存储方案。base64:【标准库】Base16, Base32, Base64, Base85 数据编码chardet:字符编码探测器:对文本、网页、XML 的编码格式检测,支持中文、日文、韩文等多种语言ConfigParser:【标准库】读取配置文件 ini 的包。markdown:markdown 工具,如 md 转 htmlxlwings:【优先考虑 pandas】读与改 excel,与 matplotlib 及 pandas 无缝连接,可调用 excel 的 vbatablib:方便地处理表格类型数据。支持导出:Excel、 JSON、 YAML、 Pandas DataFrames、 HTML、 TSV、 OSD、 CSV、 DBF 等格式aiofiles:文件异步操作mimetypes:标准库,将文件名映射为 MIME 类型。python-docx:读写 docxdemjson:javascript 的 json 字符串转 python 的字典
概述
计算机常见文件格式一览
- 参考资料:Manjaro 用户主目录下
.dir_colors
1 | DOS-Style: cmd, exe, com, bat, sh, csh, btm |
配置文件
配置文件:用于参数设置,不改变源码的情况下改变程序的运行。
ini,cfg,conf, 甚至txt的 text 文本文档
- 可移植、独立于平台
- but,配置文件的末路是
.py,config.py
1 | 首选 |
Yaml:以数据为中心- 空格易出错,可注释,数据格式多样
json:- 应用于:存储程序运行过程中产生的配置
- 可读性强,不支持注释
ini:- 应用于:经常阅读与编写的配置文件,如命令行程序的配置文件。
ini
- 节:
[ ]:section- 默认节(DEFAULT),可省略
- 键值对:key-value:options
1 | [db] |
数据类型序列化
pickling:序列化:持久化:将对象如字符串、列表、字典从内存中变成可存储或可传输的过程。
unpickling:反序列化:变量内容从序列化的对象重新读到内存里
- 序列化对象:序列化后,可将序列化后的内容写入磁盘,或进行网络传输
- 解决内存中对象的持久化与传输问题
- 原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。
- 原生类型的容器:元组,字典和集合
- 函数,类,类的实例
- 等
- txt:纯文本,
with openr, w, a, b + 模式的直接读写 - CSV:逗号分隔值
- JSON:键值对
- SQL:数据库文件
- 解决内存中对象的持久化与传输问题
CSV
csv:【标准库】支持逗号分隔值格式直接读取和写入文件,一般用于数据库或 excel。
csvkit:用于转换和操作 CSV 的工具。
CSV:Comma Separated Values:逗号分隔值:文本形式的二维表,每一行为一条记录,第条记录的字段数量一样,字段间以逗号分隔
python:二维数组
第一行为表头,用于说明每个字段的名称和意义。
1 | id,name,gender,age |
基本操作
1 | import csv |
XML
XML:XML 格式解析。
xmltodict:致力于将 XML 变得像 JSON。
- 不优雅的文件,OUT
XML is crap. Really. There are no excuses. XML is nasty to parse for humans, and it’s a disaster to parse even for computers. There’s just no reason for that horrible crap to exist.–Linus Torvalds.
1 | <server> |
1 | xml.etree.ElementTree |
JSON
json:【标准库】json 编码与解码器
JSON:JavaScript Object Notation:JavaScript 对象表示法:轻量级文本数据存储与交换格式,应用程序在网络通信的首选协议格式
- 用于 web 上数据交换的最广泛使用的数据格式。
- int/str/list/tuple/dict 类型
- 作用:文本方式展示结构化数据,常用于 HTTP 下的数据传输。
- 优点:简单好用、跨平台
- 数据结构:
- 对象:键值对
- 数组
" "内为属性名或值,:后接前者的值。- JSON 官网最新规范规定“键”或者“值”都需要用双引号来表示。
- 键值对:对象:{}
- 值的有序列表:数组:[]
- 简洁清晰的层次结构:
- 易于阅读与编写, 结构符合程序员阅读习惯
- 数据为键值对形式,逗号分隔,
- 大括号保存对象,方括号保存数组
- None,bool,int,float,和 str,当然也包含字典,列表和元组.
- 易于给各种编程语言使用:
- 与 javascript 天然兼容,无需解析,直接使用
- 易于机器解析与生成,易于转化为数据结构
- 轻量级数据交换格式:比传统的 xml 更小巧,传输省流量
- json 文件里的是字符串,utf-8 编码
- 带 s 的方法是数据类型间的转化 str <–> dict,不带 s 的都是数据与文件的转化
1 | { |
数据类型
- 所有的键都是字符串
| JSON 类型 | Python 类型 |
|---|---|
| {},object | dict |
| [],array | list |
| “string”,字符串,string(必须双引号) | str |
| 1234.56,数值,number | int 或 float |
| true/false,布尔类型 | True/False |
| null,空值 | None |
Python 字典
1 | { |
dumps+loads+dump+load
json.dumps(s, default=lambda obj: obj.__dict__)
1 | import json |
遇到的问题
ensure_ascii
如果无任何配置,或者说使用默认配置,输出的会是 ASCII 字符,而不是真正的中文,这是因为 json.dumps 序列化时对中文默认使用的 ASCII 编码
1 | print(json.dumps('中国')) |
pickle
pickle:【标准库】Python 特有的序列化对象的标准方式。
- 强大而不通用:
- 优点:强大,支持所有的 Python 类型,如函数与类,保存为 bytes 类型,再反序列化为 Python 类型
- 缺点:
- 只能用于 Python,且不同版本的 Python 操作出来的可能不兼容 ,存储数据占空间大
- pickle会基于你加载的类对象对数据进行对象化,但它把类对象的路径也打包了进去,解析时需要对应的类在对应目录、文件里
- 不安全:反序列化别人精心设计的数据时,可能被动执行任意代码。
- 只unpickle你信任的数据
- 故 OUT
- 只能用于 Python,且不同版本的 Python 操作出来的可能不兼容 ,存储数据占空间大
dumps+loads
1 | import pickle |
dump+load
1 | import pickle |
异常
PickleError:封装和拆封时出现的异常类,继承自 ExceptionPicklingError:遇到不可封装的对象时出现的异常,继承自 PickleErrorUnPicklingError:拆封对象过程中出现的异常,继承自 PickleError
测试
1 | 小文件 10ms级,具体取决于大小与磁盘 |
BSON
BSON:short for Binary JSON:JSON 的二进制序列化编码格式
- 特点:
- 轻量级:Lightweight
- 可遍历:Traversable
- 高效性:Efficient
YAML
pyyaml:yaml 格式文件操作
概述
YAML:YAML Ain’t a Markup Language:YAML 不是一种标记语言,
yaml:/ˈjæməl/:可读性高、用来表达数据序列化的格式
- YAML 是针对所有编程语言的人性化数据序列化标准,快成为 Linux 下的主流配置文件的文件类型,but 格式要求过于严格。
- 以数据为中心,比 json、xml 更适合做配置文件
- 【OUT】:相同内容,采用 yaml、json 文件,load 1000 次,yaml 需要 1.117 秒,json 只需要 0.005 秒
- 特点:
- 优点:
- 数据格式多样
- 支持注释
- 易读
- 缺点:
- 一个空格可能引发惨案
- 致命缺点:对于相同数据类型的数据,表现形式不一样,虽然 20.2 可能是 float 或 str,但这种特性导致了不稳定性。
- 优点:
1 | 当前版本号: |
- 区分大小写,字符串不需引号
- 空格缩进表层级,空格数不定,相同层级元素左侧对齐即可
- 注释为 #
- 纯量 (scalars):单个的、不可再分的值(如:字符串、bool 值、整数、浮点数、时间、日期、null 等)
None 值可用 null 可 ~ 表示
1 | # 纯量 |
基本使用
扩展名:
.yaml或.yml大小写敏感
使用空格的缩进:只能用空格表缩进,同一层级左侧对齐
key: value,注意
冒号后面必须有一个空格1
2
3
4
5
6
7
8
9
10
11# person.yml # 单行注释,不支持多行注释
person:
last-name: zhangsan
age: 20
birth: 2017/12/15
boss: false
maps:{key1:value1,key2:value2}
lists:[a,b,c]
dog:
name: dog
age: 1数据结构:
- 字面量(数字、字符串、布尔值):单个的、不可再分的值
k: v,字符串不用加引号双引号不会转义特殊字符,单引号会转义特殊字符
name: chen age: 18 isStudent: false1
2
3
4
5
6
7
8
9
10
- **数组**:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 可多行或单行
```yaml
names:
- chen
- zhang
- li
age:[18,19,20]
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 字面量(数字、字符串、布尔值):单个的、不可再分的值
1 | #多行结构 |
1 | # 加载 |
struct
struct:【标准库】处理不定长度的二进制记录格式
- 如 不使用
zipfile即可循环遍历一个 zip 文件的所有头信息。 - Pack 代码
"H"和"I"分别代表两字节和四字节无符号整数。"<"代表它们是标准尺寸的小尾型字节序:
1 | struct.pack() |
IO
io:【标准库】处理流的核心工具
shelve
shelve:【标准库】Python 对象持久化。简单的数据存储方案。
- shelve 模块以类似字典的方式将 Python 对象持久化,它依赖于 pickle 模块,但比 pickle 用起来简单。当我们写程序的时候如果不想用关系数据库那么重量级的程序去存储数据,可以简单地使用 shelve。shelve 使用起来和字典类似,也是用 key 来访问的,键为普通字符串,值则可以是任何 Python 数据类型,并且支持所有字典类型的操作。
1 | shelve.open(filename, flag='c', protocol=None, writeback=False) |
如果我们想让 shelve 去自动捕获对象的变化,应该在打开 shelve 文件的时候将 writeback 参数设置为 True。此时,shelve 会将所有数据放到缓存中,并接收后续对数据的修改操作。最后,当我们 close() 的时候,缓存中所有的对象一次性写回磁盘内。
writeback=True 有优点也有缺点。优点是可以动态修改数据,并减少出错的概率,让对象的持久化对用户更加的透明。但也有很大的缺点,在 open() 的时候会增加额外的内存消耗,并且当 close() 对象的时候会将缓存中的每一个细节都写回到文件系统,这也会带来额外的等待时间和计算消耗,因为 shelve 没有办法知道缓存中哪些对象修改了,哪些对象没有修改,所有的对象都必须被写入。
base64
base64:【标准库】Base16, Base32, Base64, Base85 数据编码
- 用 64 个字符来编码任意二进制文件如 exe、jpg、pdf 等
- 64 个字符:[A-Za-z0-9{+}{/}]
- 对二进制数据进行处理,每 3 个字节一组,一共是 3x8=24bit,划为 4 组,每组正好 6 个 bit:这样我们得到 4 个数字作为索引,然后查表,获得相应的 4 个字符,就是编码后的字符串。
- 所以,Base64 编码会把 3 字节的二进制数据编码为 4 字节的文本数据,长度增加 33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
如果要编码的二进制数据不是 3 的倍数,最后会剩下 1 个或 2 个字节怎么办?Base64 用\x00字节在末尾补足后,再在编码的末尾加上 1 个或 2 个=号,表示补了多少字节,解码的时候,会自动去掉。 - 由于标准的 Base64 编码后可能出现字符
+和/,在 URL 中就不能直接作为参数,所以又有一种 “url safe” 的 base64 编码,其实就是把字符+和/分别变成-和_:
- 通过查表的编码方法,不能用于加密(即使是自定义的编码表也不行)
- 用处:
- 小段内容的编码,如数据证书签名、Cookie 的内容等
1 | str_ = 'Hello World' # 原始数据 |
chardet
chardet:字符编码探测器:对文本、网页、XML 的编码格式检测,支持中文、日文、韩文等多种语言
- Unicode 有
str与bytes两种数据类型,可通过encode()和decode()方法转换,但是,在不知道编码的情况下,对bytes做decode()不好做。 - 对于未知编码的
bytes,要把它转换成str,需要先“猜测”编码。猜测的方式是先收集各种编码的特征字符,根据特征字符判断,就能有很大概率“猜对
1 | import chardet |
ConfigParser
ConfigParser:【标准库】读取配置文件 ini 的包。
1 | import configparser |
写入
1 | import configparser |
读取
1 | import configparser |
- 数据类型:
- 在解析配置文件时,不区别类型,value 视为字符串
- 整型:
getint- 不能用
getint去取 float,会报错
- 不能用
- 浮点型:
getfloat - 布尔型
- 布尔型:’yes’/‘no’,’on’/‘off’,’true’/‘false’ 和 ‘1’/‘0’ 等来设定
- 通过 getboolean 函数读取对应的参数
- 默认值:
top.get("max_iter", fallback=4)
- 插值:通过
${section:option}的方式调用其他 section 的参数
1 | [DEFAULT] |
1 | print(config["DEFAULT"].getboolean("a")) |
markdown
markdown:markdown 工具,如 md 转 html
mistune
mistune:快速且强大的 Python 解析库
- 特点:
- 性能
- 灵活性:轻松扩展和定制
- 支持标准的 Markdown 语法,可通过插件扩展支持更多的功能(数学公式、高亮代码、自定义渲染等)
- 问题:无法解析列表后的多个空行
基本使用
- Markdown 解析
1 | import mistune |
- HTML 渲染:将 markdown 转换为 HTML
1 | import mistune |
- 插件支持
1 | # 代码高亮 |
- 自定义渲染
1 | import mistune |
- mistune:Streamlit 也是用的这个
- Mistune 提供了插件机制,允许用户在解析过程中添加自定义行为。可以通过插件来扩展 Markdown 的功能,例如添加新的语法支持或修改现有的解析逻辑。
1 |
|
tomd:html 转 markdown
Mistune 是一个快速、轻量级且高度可扩展的 Markdown 解析器,使用纯 Python 实现。它以其高性能和灵活性著称,适合需要自定义渲染和扩展功能的应用场景。
主要特点
- 高性能: Mistune 在解析速度上表现非常优异,适合对性能有较高要求的项目。
- 高度可扩展: 提供了自定义渲染器和插件机制,用户可以轻松定制 Markdown 解析的行为。
- 符合 CommonMark 标准: 默认情况下,Mistune 遵循 CommonMark 标准,确保 Markdown 文本的一致性解析。
- 轻量级: 设计简单,易于集成和使用。
excel
xlwings:【优先考虑 pandas】读与改 excel,与 matplotlib 及 pandas 无缝连接,可调用 excel 的 vba
- 如无必要,勿增实体。尽量不增加新的模块,excel 即二维数组,用 pandas
1 | # 简单示例,对 excel 有需求上 pandas |
tablib
tablib:方便地处理表格类型数据。支持导出:Excel、 JSON、 YAML、 Pandas DataFrames、 HTML、 TSV、 OSD、 CSV、 DBF 等格式
1 | import tablib |
aiofiles
aiofiles:文件异步操作
mimetypes
mimetypes:标准库,将文件名映射为 MIME 类型。
filetype:第三方库,还不如 mimetypes,.md的也测不出来也就算了,.ppt的都不行
MIME:Multipurpose Internet Mail Extensions:多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
1 | import mimetypes |
Office
python-docx:读写 docxpython-pptx:读写 pptxxlrd:读取 excel 的库xlwt:写 excel 的库xlutils:操作修改 excel 文件方法的库(基于 xlrd 与 xlwt,先复制一个副本操作后保存)xlsxwriter:创建 Excel XLSX 文件的 Python 模块
1 | import docx |
1 | from pptx import Presentation |
遇到的问题
- xlrd.biffh.XLRDError: Excel xlsx file; not supported
- 解决方案:原因是新版的 xlrd 不支持 xlsx 文件的读入,需安装老版本:
pip3 install xlrd==1.2.0
python-pptx
python-pptx:python 操作 ppt 的库
概述
常识
- 基本概念
- Slide:幻灯片,指 ppt 中的一页
- Shape:方框:指 ppt 中的一个块,如形状、文本框
- Run:文字块,一般为较少字符
- Paragraph:段落,通常有序号
操作
1 | from pptx import Presentation |
demjson
demjson:javascript 的 json 字符串转 python 的字典
- 用处:用来解析 json 库解析不了的非标准 json 格式字符串
{0:"a",1:"b",2:"c",3:"d"},key 没有引号,只有值有引号
1 | import demjson |
PyMuPDF
#最佳实践
pypdf2
pypdf2:对 pdf 文件的基本操作
- 能够拆分、合并、裁剪和转换 PDF 文件的页面。它还可以向 PDF 文件添加自定义数据、查看选项和密码。它可以从 PDF 中检索文本和元数据,也可以将整个文件合并在一起。
1 | from PyPDF2 import PdfFileMerger |
fpdf
fpdf:PDF 工具库
1 | pip install feather-format |
feather
- 相比于csv、pickle,占用体积最小、速度最快
