Python 常见库
介绍
标准库
- Python 标准库官网
os
os.name
字符串指示你正在使用的平台。比如对于 Windows,它是’nt’,而对于 Linux/Unix 用户,它是’posix'
os.getcwd()
函数得到当前工作目录,即当前 Python 脚本工作的目录路径
os.getenv()
和os.putenv()
函数分别用来读取和设置环境变量
os.listdir()
返回指定目录下的所有文件和目录名
os.remove()
函数用来删除一个文件
os.system()
函数用来运行 shell 命令
os.stat
执行 stat 信息
st_mode
: inode 保护模式
st_ino
: inode 节点号
st_dev
: inode 驻留的设备
st_nlink
: inode 的链接数
st_uid
: 所有者的用户 ID
st_gid
: 所有者的组 ID
st_size
: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据
st_atime
: 上次访问的时间
st_mtime
: 最后一次修改的时间
st_ctime
: 由操作系统报告的 ctime
six
: 专门用来兼容 Python 2 和 Python 3 的库。解决了如 urllib
的部分方法不兼容, str
和 bytes
类型不兼容等问题
sys
sys.argv
程序的入口参数,是一个列表
sys.path
装载模块的搜索路径,是一个列表
sys.version
python 的版本,是一个 string
sys.exit(status)
退出程序,是一个函数
sys.stdin.buffer.read(<size>)
从 stdin 读取二进制数据
time
time.sleep(n)
休息 n 秒,可以是小数
time.time()
返回一个浮点数,从 1970-1-1 00:00:000
到当前绝对时间的秒数,还有 6 位的小数
time.localtime(second)
返回一个元组,如果没有 second,就使用 time.time()返回的秒
- 元组示例:
(2009, 8, 2, 20, 40, 3, 6, 214, 0)
time.strftime(format)
格式:time.strftime(’%Y-%m-%d %H:%M:%d’ ‘2009-08-02 20:50:02’
time.monotonic()
确保计时的单调性,在系统时钟发生复位时它能自动将该事件的时差考虑进去
math
- 四舍五入,向下取余:
import math; math.floor(39.9)
- 平方根:
import math; math.sqrt(9)
- x 的 y 次方:
import math; math.pow(x, y)
- random
- 随机数:
import random; random.randint(1, 100)
- md5
md5.new(arg)
arg 要 md5 的内容,返回一个 md5 对象
digest()
摘要,返回 16 个字节
hexdigest()
16 进制摘要,返回 32 个字节
- base64
- base64.b64encode
- base64.b64decode
- hashlib
- hashlib.md5()
- hashlib.sha1()
- 字符串与 Python Obj 转化
- eval 作用:将字符串
str
当成有效的表达式来求值并返回计算结果,可以把 list、tuple、dict 和 string 相互转化,示例:
str1 = "{'a': 1, 'b': 2}"
json1 = eval(str1)
print(type(json1))
print(json1)
- ast 模块帮助 Python 应用程序处理 Python 抽象语法语法树
import ast
str1 = "{'a': 1, 'b': 2}"
json1 = ast.literal_eval(str1)
print(type(json1))
print(json1)
json.loads() & s.replace()
库
- 正则获取
import re
# 提供的字符串
s = "{'a': 1, 'b': 2}"
# 正则表达式模式,匹配key和value
pattern = r"'([^']+)':\s*('([^']*)'|([^']*))"
# 查找所有匹配项
matches = re.findall(pattern, s)
# 根据匹配结果构建字典
result_dict = {match[0]: match[1] for match in matches}
# 打印结果字典
print(result_dict)
s = "{'a': 1, 'b': 2}"
def string_to_dict(s):
new_dict = {}
# Determine key, value pairs
mappings = s.replace('{', '').replace('}', '').split(',')
for x in mappings:
key, value = x.split(':')
# Automatically convert (key, value) pairs to correct type
key, value = eval(key), eval(value)
# Store (key, value) pair
new_dict[key] = value
return new_dict
d = string_to_dict(s)
print(d)
print(type(d))
- 从命令行读取
raw_input()
函数会把所有的输入当作原始数据(raw data),然后将其放入字符串中
key = input("输入字符:")
函数会假设用户输入是合法的 python 表达式
psutil
用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等
shutil
module 很方便,是 os 模块的补充
re
正则提取字符串
import re
re.match(r'^(\d+)(0*)$', '102300').groups()
re.compile(r'^(\d{3})-(\d{3,8})$')
先预编译,然后在 match,提高效率
configparser
读取 config 或 ini 配置文件
http
库
fcntl
文件的加锁与解锁
- heapq Heap queue algorithm 该模块提供了堆队列算法的实现,也称为优先级队列算法。
- operator Standard operators as functions
- site
site.getusersitepackages()
获取用户的 python site 路径:~/.local/lib/pythonX.Y/site-packages
site.getsitepackages()
返回包含所有全局 site-packages 目录的列表
- string 可打印字符
import string
s = "some\x00string. with\x15 funny characters"
printable = set(string.printable)
''.join([i for i in filter(lambda x: x in printable, s)])
# 'somestring. with funny characters'
-
weakref 弱引用
- Python 的垃圾回收机制会自动回收没有被引用的对象,通过
引用计数
来标记清除
- 弱引用不会增加对象的引用数量
- 弱引用一般使用在缓存应用中
- 创建弱引用对象:
weakref.ref(object[, callback])
weakref.proxy(object[, callback])
proxy 相比 ref 获取的对应,可以省去函数调用
weakref.WeakKeyDictionary([dict])
当 key 不在有引用计数时,key-value 自动在字典中删除
weakref.WeakValueDictionary([dict])
当 value 不在有引用计数时,key-value 自动在字典中删除
weakref.finalize(object, callback, callparams)
标志原始对象的销毁
weakref.getweakrefcount(object)
获取弱引用计数
-
执行脚本
import subprocess
result = subprocess.run("echo \"blah\"", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
第三方库
- 解析 html 页面:
from HTMLParser import HTMLParser
- 图像处理标准库:
PIL:Python Imaging Library
- email
- Python 对 SMTP 支持有 smtplib 和 email 两个模块,email 负责构造邮件,smtplib 负责发送邮件
- Python 内置一个 poplib 模块,实现了 POP3 协议,可以直接用来收邮件。要把 POP3 收取的文本变成可以阅读的邮件,还需要用 email 模块提供的各种类来解析原始文本,变成可阅读的邮件对象
json
模块提供的方法和 cPickle 模块类似,都有 dump,dumps,load,loads 方法
- python-socketio
- rq 轻量级的任务队列
- plotly 开源数据可视化框架
- Pillow(PIL)是 Python 图像处理的基础库
- 进度条(Progress Bar)
- pprint 美化输出
- xmlrpc
- Traitlets 允许 Python 自定义类拥有
类型检查(@default)
、动态计算默认值(@observe)
和Change回调(@validate)
这三种特性
tempfile
创建临时文件和文件夹
retrying
提供 @retry()
装饰器
curlify
输出 requesty
包的 curl
实现
serial
与串口通信的模块
attrs
面向对象编程 OOP
yaml
data:
name: "中国"
cityName: "上海"
import yaml
with open('old.yaml', 'r', encoding='utf-8') as f:
content = yaml.safe_load(f.read())
with open('new.yaml', 'a', encoding='utf-8') as fw:
yaml.dump(content, fw, allow_unicode=True) # allow_unicode=True 解决 yaml 中文乱码
requests
-
requests.get("http://example.org", proxies={"https": "http://10.10.10.10:1080"})
- 超时
- 如
get
可以通过 timeout
字段控制
- connect and the read timeouts
r = requests.get('https://github.com', timeout=(3.05, 27))
,参考
- 还需要考虑因 DNS 解析超时引起的超时情况
-
解决 self-signed certificate in certificate
问题
requests.exceptions.SSLError: HTTPSConnectionPool('host=<domain>', port=443): Max retries exceeded with url: <url> (caused by ...ssl. SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain ...)
解决方式:
-
查看证书 openssl s_client -connect <domain>:443 -showcerts
-
requests.request(xxx, verify=False)
-
使用 truststore
-
将证书添加到 certifi 的certifi/cacert.pem
中
import certifi
print(certifi.where())
- 环境变量
REQUESTS_CA_BUNDLE
覆盖 Requests 的cert.pem
路径
其他
a=0xffff
十六进制表示
- import types types.StringType
- 判断类型用
type()函数
,判断继承类的类型用 isinstance()函数
- type()可以动态创建类,而不需要使用 class 定义的方式,例如:
type('Hello', (object,), dict(hello=fn))
,通过 type()函数创建的类和直接写 class 是完全一样的,因为 Python 解释器遇到 class 定义时,仅仅是扫描一下 class 定义的语法,然后调用 type()函数创建出 class
- 元类 metaclass:除了使用 type()动态创建类以外,要控制类的创建行为,还可以使用 metaclass
- 序列化在 python 中叫
pickling
,其他语言中称为:serialization
,marshalling
- 通常 class 的实例都有一个
__dict__
属性,它就是一个 dict,用来存储实例变量
- 大部分 web 应用都是 IO 密集型
- 单进程的异步编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序
- collections 模块
- 用 namedtuple 可以很方便地定义一种数据类型,它具备 tuple 的不变性,又可以根据属性来引用,使用十分方便
- deque 是双向列表,解决了 list 插入和删除低效的问题
- defaultdict(带默认值的 dict) 当 key 不存在时,不再抛出 KeyError,而是返回一个默认值
- OrderedDict,有顺序的 dict
- Counter 实际上是 dict 的一个子类
- itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是 list,而是迭代对象,只有用 for 循环迭代的时候才真正计算
使用示例
Python 排序
from distutils.version import StrictVersion
# from packaging.version import Version # 建议使用,Version 重新封装
versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
versions.sort(key=StrictVersion)
versions.sort(key=lambda s: list(map(int, s.split('.'))))
versions_list.sort(key=lambda s: [int(u) for u in s.split('.')])
re 正则表达式
import re
s = 'abc123de'
pattern = re.compile(r'(?P<abc>\d+)(?P<xyz>\D+)')
m = re.search(pattern, s)
m.group('xyz')
m.group('abc')
pickle 示例
- pickle 是一个持久化模块,支持持久化各种数据,适合于 Python 复杂数据的存贮
- 类似的实现 shelve、cPickle、Json、Protobuf
cPickle
模块是 c 语言写的,专门处理序列化
cPickle.dumps()
dump 成 str,cPickle.dump()
dump 到文件中,cPickle.loads()
反序列化 str 成对象,cPickle.load()
从文件中反序列化出对象
import pickle
data = {'str': 'hello world!', 'list': [1, 2, 3, 4]}
# 写示例
with open('data.pickle', 'wb') as f:
pickle.dump(data, f, -1)
# 读示例
with open('data.pickle', 'rb') as f:
data2 = pickle.load(f)
print(data2)
# 复制到变量
obj_bytes = pickle.dumps(data)
json
json
序列化,解决:TypeError: Object of type datetime is not JSON serializable
import json
from datetime import datetime
now = datetime.now()
# set default=str
json_str = json.dumps({'created_at': now}, default=str)
print(json_str) # '{"created_at": "2023-07-19 17:42:13.501631"}'
print(type(json_str)) # <class 'str'>
import json
import base64
import zlib
obj = [1, 2, 3]
base64.b64encode(zlib.compress(str.encode(json.dumps(obj), 'utf-8'), 6))
zlib.decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)
xmlrpc
from xmlrpc.server import SimpleXMLRPCServer
# 创建一个服务器实例
server = SimpleXMLRPCServer(("0.0.0.0", 8000))
def add(args):
return args[0] + args[1]
# 注册函数到服务器
server.register_function(add)
# 开始监听请求
print("Listening on port 8000...")
server.serve_forever()
from xmlrpc.client import ServerProxy
# 创建一个代理对象,连接到服务器
proxy = ServerProxy("http://localhost:8000")
# 调用服务器上的 add 函数
result = proxy.add([2, 3])
# 打印结果
print(result) # 输出: 5
unicode
\u
开头的 unicode
转中文
# python3
i.encode('utf-8').decode('unicode_escape') # i = '\u751F\u5316\u5371\u673A'
# python2
i.decode('unicode-escape')
str
d = {
"name": "xiexianbin",
"url": "http://www.xiexianbin.cn",
"page": "18",
"city": "china",
}
# 获取字典 key 的最大值
max_len = max(map(len, d.keys()))
# 左对齐输出
for k, v in d.items():
print(k.ljust(max_len), ":", v)
# 右对齐输出
for k, v in d.items():
print(k.rjust(max_len), ":", v)
# Output
name : xiexianbin
url : http://www.xiexianbin.cn
page : 18
city : china
name : xiexianbin
url : http://www.xiexianbin.cn
page : 18
city : china
timeit
timeit
用于测量代码的执行时间
import timeit
result = timeit.timeit('sorted(range(1000)); print(math.pi)', setup='import math')
import timeit
import math
result = timeit.timeit('print(math.pi)', number=5, globals=globals())
print(result)
import timeit
# 创建一个自定义的命名空间
my_globals = {}
exec('import math', my_globals) # 使用exec在自定义命名空间中执行import语句
# 使用自定义的命名空间
# result = timeit.timeit('print(math.pi)', number=5, globals=my_globals)
result = timeit.repeat('print(math.pi)', repeat=5, number=1000000, globals=my_globals)
print(result)