前言
之前重写了视频字符画处理的代码,然后这两天又在研究命令行和网络。读了一点开源工具的代码,越来越觉得有必要针对性地学习一下一些重要的基础库。
这里呢就列个小清单,把我认为有必要学习的库写一下。
带 [ x ] 的表示已完成
时间
time
:对 c 语言库的封装,优点是速度快。- 常用的函数:时间戳 -
time.time()
,睡眠 -time.sleep()
- 常用的函数:时间戳 -
- datetime:时间日期处理库,比
time
更强大,支持在日期上进行各种操作(加减乘除)。 maya
/arrow
: 第三方时间日期处理库,比 datetime 更好用。
系统
用于访问一些由 Python Interpreter 维护的变量,一般都和系统、流、命令行参数之类的相关。
用于使用一些操作系统相关的函数,还有操作系统环境变量。(相关:比如 os.fork 在 windows 上就用不了)
系统调用函数,目的在于取代 os.system 和 os.spwan* 的库,并提供更强大的功能。
- pyinvoke:
3rd
是 fabric2 的本地方法调用模块,比 subprocess 更强大。
SSH 远程执行命令
- paramiko:
3rd
Python 的 SSHv2 协议实现。使用 Python 远程执行命令的首选库。
- fabric2:
3rd
构建在 paramiko 和 pyinvoke 之上,提供更方便的远程命令执行功能。(运维用)
文件路径
- [ x ] pathlib
该模块使用类来表示系统路径,而且是操作系统无关的。终于不需要去管 Windows 和 Linux 下分隔符的差别了。
更方便的是,路径之间的组合可以直接通过“计算”实现。(它还提供了 glob 简化正则表达式,用于路径匹配)
- [ x ] contextlib
这是一个上下文管理库,可用于自定义能使用 with 上下文管理的类。常用于 网络、数据库连接之类的地方。
字符串处理
- [ x ] re
正则,不解释
- [ x ] io.StringIO io.BytesIO
提供了一个 str 流对象,可读可写。API 等同于 open() 返回的流对象。类似 Java 的 StringBuffer BytesBuffer
网络库(客户端)
- [ x ] requests:
3rd
超易用的 http 请求库
网络协议处理的标准库(说网络协议,自然不仅 http 了)
Web 应用框架(服务端)
- [ x ] flask:
3rd
轻量的 web 应用框架(服务端),用来写 RESTful API 特别方便。
依赖管理、环境隔离
- [ x ] pipenv
环境管理和依赖管理的终极解决方案,缺点是 lock 慢到吐血。
依赖管理工具,
install
uninstall
list
都不会用还敢叫 Python 程序员?
项目打包工具,配置项还挺多的,需要用的时候再查文档吧。。
Python 的依赖管理工具,曾经很混乱。不过现在算是越做越好了。更多的信息参见Python Packaging User Guide
迭代器、数据结构、高阶函数
- [ x ] itertools
- [ x ] colletions
- [ x ] functools 常和 opreator 一起用
日志(入门简单,深入有点难。。)
比 logging 更好用,而且支持彩色日志输出。
测试(有待提高)
官方测试框架,师出 Junit。缺点是繁琐。
- [ x ] pytest:
3rd
看到很多热门开源项目都用的 pytest,有时间得学一下。
使用最多的替换掉网络请求的方式,几乎所有场景下都可以用。所有网络请求和 rpc 调用等都可以用 mock.patch 来模拟返回值。
就像用Java的Mockito一样。
数据转换
a. 持久化(这个很简单)
- [ x ] pickle
一个对数据进行 object 和 bytes 之间的转化的模块。如果你只需要使用 Python 读取这些数据,用 pickle 会是个很好的选择。
- [ x ] json
和 pickle 很类似,不过它做的是 object 和 json 之间的转化。
这个模块在网络开发中用得很多。
b. 数据库(已搞定)
如果需要保存数据,而且需要对其做更复杂的操作,就需要用到数据库了。
- [ x ] sqlite3: Python 自带的文件数据库,用于学习很方便。而且 python 数据库驱动都遵循同一个 dbapi 标准,学会一个就学会了所有。
- [ x ] PyMySQL:
3rd
MySQL 的第三方连接库,遵循 dbapi 标准。 - [ x ] SQLAlchemy:ORM 框架,而且有数据库连接池和详细的日志系统。
c. 结构化二进制
执行 Python 对象与 C struct (bytes) 之间的转换,一般用于解析或构建下列数据:
1. 网络协议中的报文:IP包、TCP/UDP 包
2. 音乐、视频文件:wav/mp3/mp4/midi 等
并发并行
多进程,由于 GIL 的存在,计算密集型工作用多线程基本没用,这时就需要这个库,或者用 C API.
另外因为多进程不共享数据,因此需要使用 Queue 或者 Pipe 通信。
API 和 multiprocessing 非常类似,但是要搞清楚关键区别:一个是进程一个是线程。
- [ x ] concurrent.futures
线程池/进程池,而且提供更高层的抽象。
进阶:线程池、数据库连接池、消息队列
异步I/O(适用于网络编程)
协程相当于轻量级线程,特别适用于I/O密集场景。
任务调度
我有个个人项目,需要每天定时发送消息。我最初是直接加了个线程来干这个事。。然后我发现了,原来有 scheduler 这个东西。。
- apscheduler:支持 asyncio 的 scheduler
其他(偏向特定领域了,非必要)
1. 数据分析/机器学习
- numpy
- pandas
- matplotlib
2. 和 C 语言通信
和C语言通信一般有两个用途,一是做性能优化,二是用于调用一些不开源的库。
P.S. a. 为啥不说 ctypes: 因为感觉 api 太丑。用 Python 就图个乐子,所以拒。b. C 拓展:考虑到最近很多人都说 PyPy 是未来,很多项目也明确表示支持 PyPy,C拓展方式还是尽量避免。这样以后移植也方便。c. 各方法优缺点分析