Python-常用模块
Python 常用包、模块
python交互解释器查看有哪些module
help(“modules”)
>>> help("modules")
Please wait a moment while I gather a list of all available modules...
BaseHTTPServer binhex iniparse sched
Bastion bisect inspect select
Python2 SimpleHTTPServer
python2 自带了一个 web 服务器 SimpleHTTPServer
我们可以很简单地输入下面的命令来启动 web 服务器,提供一个文件浏览的 web 服务。
python -m SimpleHTTPServer
然后在浏览器输入 http://localhost:8000
就可以看到当前目录下的所有目录和文件了。
即默认端口为8000,可以加参数指定端口,例如:
python -m SimpleHTTPServer 8080
更复杂的用法直接可以看 python 的文档:http://docs.python.org/library/simplehttpserver.html
此外这样启动的 http 服务器在 ctrl+c 后就停止了,可以加参数 &
使之在后台运行:
python -m SimpleHTTPServer &
生成的新的进程为当前 bash 的子进程,所以,当我们关闭当前 bash 时,相应的子进程也会被 kill 掉,这也不是我们想要的结果。
在命令的开头加一个 nohup,忽略所有的挂断信号,如果当前 bash 关闭,则当前进程会挂载到 init 进程下,成为其子进程,这样即使退出当前用户,其 8000 端口也可以使用。
nohup python -m SimpleHTTPServer 8000 &
Python3 http.server
Python3 中的写法 python3 -m http.server 8000
Python2 的 BaseHTTPServer 模块已被合并到 Python 3 的 http.server 模块中。当将源代码转换为 Python 3 时 2to3 工具将自动适应导入。
基于SimpleHTTPServer的文件上传下载工具
python 写的轻量级的文件共享服务器(基于内置的 SimpleHTTPServer 模块)支持文件上传下载
300行python代码的轻量级HTTPServer实现文件上传下载(Python3版本)
https://github.com/masikkk/py/blob/master/tools/http_server_with_upload.py
拷贝自
https://gist.github.com/0312birdzhang/7dc7b8fde43b64ecd004
模块
urllib/urllib2/requests
python2.X 有这些库名可用: urllib, urllib2, urllib3, httplib, httplib2, requests
python3.X 有这些库名可用: urllib, urllib3, httplib2, requests
对于python2.X
urllib2 可以接受Request对象为URL设置头信息,修改用户代理,设置cookie等, urllib只能接受一个普通的URL.
urllib 提供一些比较原始基础的方法而urllib2没有这些, 比如 urlencode
对于python3.X
将python2.7版本的urllib和urllib2 合并在一起成一个新的urllib包, 此包分成了几个模块:
- urllib.request 用于打开和读取URL,
- urllib.error 用于处理前面request引起的异常,
- urllib.parse 用于解析URL,
- urllib.robotparser 用于解析robots.txt文件
python2.X 中的 urllib.urlopen()被废弃, urllib2.urlopen()相当于python3.X中的urllib.request.urlopen()
requests 使用的是 urllib3,继承了 urllib2 的所有特性。Requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
推荐使用 requests
提取域名
from urllib.parse import urlparse
domain = urlparse(start_url).netloc
使用 urllib.parse.urlparse 方法解析 URL,返回一个包含 URL 各个部分的命名元组(ParseResult)
netloc 属性包含域名和端口(如果有),例如 www.example.com 或 www.example.com:8080
os 模块
os.path.abspath()
获取文件或目录的绝对路径
os.path.abspath(__file__)
获取当前 Python 脚本文件的绝对路径os.path.dirname(os.path.dirname(__file__))
获取当前 Python 脚本所在的目录的绝对路径
print(os.path.abspath(".")) #当前目录的绝对路径
print(os.path.abspath(r"..")) #上级目录的绝对路径
print(os.path.abspath(r"xxx.py")) #文件的绝对路径
os.path.dirname()
返回文件路径
os.path.splitext() 分割扩展名
os.path.splitext('附件:1.目录') # ('附件:1', '.目录')
os.path.splitext('/foo/bar.py') # ('/foo/bar', '.py')
os.path.splitext('/foo/bar') # ('/foo/bar', '')
os.makedirs() 创建目录
注意:如果路径中包含 ~
(用户的主目录),os.makedirs
不会自动将其扩展为完整的路径,导致创建目录失败。
可以使用 os.path.expanduser
来将 ~
扩展为完整的主目录路径
path = os.path.expanduser('~/Downloads/subpath')
os.makedirs(path, exist_ok=True)
os.path.expanduser(‘~/Downloads/subpath’) 会将路径扩展为完整路径 /Users/xxx/Downloads/subpath
os.environ 操作环境变量
https://docs.python.org/3/library/os.html#os.environ
os.environ
是 Python 中一个用于访问和操作环境变量的接口。它是 os
模块中的一个属性,提供了一个代表当前操作系统环境变量的字典对象。通过这个接口,你可以读取、修改或删除环境变量。
对 os.environ
的修改(添加、修改、删除)仅对当前 Python 进程及其启动的子进程有效,不会影响父进程或系统中的其他进程。
1、读取环境变量
import os
# 读取 PATH 环境变量
path = os.environ['PATH']
# 读取 PATH 环境变量,如果不存在返回 default_path,避免读不存在的环境变量导致 KeyError 错误
path = os.environ.get('PATH', 'default_path')
2、修改环境变量
要修改环境变量的值,你可以直接给 os.environ
字典的相应键赋值。但请注意,这样的修改只会影响当前 Python 进程及其子进程的环境变量,不会改变操作系统级别的环境变量。
import os
# 新建环境变量
os.environ['MY_VAR'] = 'my_value'
# 或者修改已有的环境变量
os.environ['PATH'] = '/new/path:' + os.environ['PATH']
3、删除环境变量
要删除一个环境变量,你可以使用 del
语句。同样,这样的删除只会影响当前 Python 进程及其子进程
import os
del os.environ['MY_VAR']
os.system() 执行命令
https://docs.python.org/3/library/os.html#os.system
os.system
是 Python 中的一个函数,它允许你直接从 Python 脚本中调用操作系统的命令行界面(CLI)或终端中的命令。
返回值:os.system
返回一个整数,这个整数是命令执行后的退出状态码。通常,0 表示成功,非0 值表示有错误发生
输出处理:os.system
执行的命令的输出会直接打印到控制台,而不是捕获到 Python 变量中。如果你需要处理命令的输出,可能需要使用其他方法,如 subprocess
模块。
import os
os.system('ls');
os.system('python script.py');
使用 subprocess 代替 os.system
使用 os.system
执行外部命令可能会带来安全风险,特别是当命令字符串中包含用户输入时。恶意用户可能会利用这一点来执行恶意代码。因此,对于需要处理用户输入的情况,建议使用更安全的方法,如 subprocess
模块。
由于 os.system
的安全性和灵活性方面的限制,Python 的 subprocess
模块通常被认为是更好的选择。subprocess
模块提供了更强大和灵活的方式来创建新的进程,连接它们的输入/输出/错误管道,并获得它们的返回码。
subprocess 模块
call() 子进程执行命令
https://docs.python.org/3/library/subprocess.html#subprocess.callsubprocess.call
是 Python 中 subprocess
模块提供的一个函数,用于执行外部命令或程序,并等待命令完成。这个函数会启动一个新的进程,运行指定的命令,然后等待这个命令执行完成。
最后返回命令的退出状态码。退出状态码通常用于表示命令是否成功执行,其中 0 表示成功,非 0 值表示出现了错误或异常。
subprocess.call
是在 Python 2.x 和 Python 3.x 中都可以使用的,但在 Python 3.5 及以上版本中,推荐使用 subprocess.run
作为替代,因为 subprocess.run
提供了更高级的错误处理和输出捕获功能。
import subprocess
returncode = subprocess.call(["command", "arg1", "arg2", ...])
run() 子进程执行命令(3.5+推荐)
https://docs.python.org/3/library/subprocess.html#subprocess.runsubprocess.run
是 Python 3.5 及以上版本中 subprocess
模块提供的一个函数,用于在新进程中执行指定的命令。这个函数是对更底层的 Popen
接口的一个更高级的封装,使得在大多数情况下,执行外部命令变得更加简单和直观。
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)
参数:args
要运行的命令和参数,可以是字符串(例如 "ls -l"
),也可以是字符串列表(例如 ["ls", "-l"]
)。capture_output
布尔值,如果为 True
,则 stdout
和 stderr
会被捕获,并作为 CompletedProcess
实例的属性返回。这与设置 stdout=PIPE
和 stderr=PIPE
相同。text
布尔值,如果为 True
,则捕获的输出会被解码为字符串(默认为 False
,输出为字节)。shell
布尔值,如果为 True
,则命令会通过 shell 运行(例如 /bin/sh -c
)。注意:使用 shell=True
可能会带来安全风险,特别是当命令包含不受信任的输入时。check
布尔值,如果为 True
,并且命令返回非零退出状态码,则会引发 CalledProcessError
异常。timeout
浮点数,命令运行的最大时间(秒)。如果命令运行时间超过这个时间,则会引发 subprocess.TimeoutExpired
异常。cwd
设置子进程的当前工作目录。env
定义子进程的环境变量。
返回值:subprocess.run
返回一个 CompletedProcess
实例,该实例包含以下属性:
args
命令及其参数的列表。returncode
子进程的退出状态码。stdout
标准输出的内容(如果capture_output=True
或stdout=PIPE
)。stderr
标准错误的内容(如果capture_output=True
或stdout=PIPE
)。
import subprocess
# 执行一个简单的命令,并等待其完成
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
# 打印命令的输出
print(result.stdout)
# 检查命令是否成功执行
if result.returncode == 0:
print("Command succeeded.")
else:
print("Command failed with return code:", result.returncode)
threading
Thread 线程(适合IO密集型)
multiprocessing
Process 进程(适合CPU密集型)
concurrent.futures
ThreadPoolExecutor 线程池
ProcessPoolExecutor 进程池
asyncio 异步I/O
asyncio 是 Python 3.4 版本引入的标准库,直接内置了对异步I/O的支持
asyncio 的编程模型基于一个消息循环(EventLoop)。EventLoop 负责调度和执行协程,将需要执行的协程放入事件循环中,当某个协程等待I/O操作时,EventLoop 会切换执行其他协程,从而提高了程序的并发性能。
asyncio 非常适合处理I/O密集型任务,如网络请求、文件读写等。在这些场景下,程序的大部分时间都在等待I/O操作完成,使用 asyncio 可以显著提高程序的执行效率。
json
json.loads() 反序列化/json串转对象
json 对象会转换为 Python dict 字典
json_str = '{"url": "http://www.masikkk.com", "name": "mde", "no": 1}'
obj = json.loads(json_str)
print "Python 对象类型:%s,数据:%s" % (type(obj), obj)
结果:
Python 对象类型:<type 'dict'>,数据:{u'url': u'http://www.masikkk.com', u'name': u'mde', u'no': 1}
json.dumps() 序列化/对象转json串
data = {
'no': 1,
'name': 'mde',
'url': 'http://www.masikkk.com'
}
json_str = json.dumps(data)
print ("JSON 串:%s" % json_str)
结果:
JSON 串:{"url": "http://www.masikkk.com", "name": "mde", "no": 1}
ensure_ascii=False 解决序列化后中文是\u转义字符
json.dumps()
函数默认会将中文等非 ASCII 字符转换为 Unicode 转义序列(unicode escape)。这是为了确保生成的 JSON 数据是有效的 ASCII 字符串。转换后的 Unicode 序列以 \u
开头,后跟字符的 Unicode 码点,例如 \u4e2d
表示中文字符“中”。
在调用 json.dumps()
时,将 ensure_ascii
参数设置为 False
,可以避免中文被转义为 Unicode。这样,生成的 JSON 字符串将直接包含中文字符,而不是 Unicode 转义序列。
例如 json.dumps(data, ensure_ascii=False)
default=str 解决对象无法序列化问题
报错:
sample = {}
sample['title'] = "String"
sample['somedate'] = somedatetimehere
TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable
解决:
json.dumps(my_dictionary, indent=4, sort_keys=True)
增加 default=str 参数,变为:
json.dumps(my_dictionary, indent=4, sort_keys=True, default=str)
解释:
default 这个参数可以解决对象不可序列化的问题,default=str 代表将无法识别的类型序列化为字符串类型,不管数据是啥类型。
但是用这个之后,如果想再返序列化,可能就不行了,我们这里不需要反序列化
How to overcome “datetime.datetime not JSON serializable”?
https://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable
三方包
pystack
https://github.com/bloomberg/pystack
pystack 是一款专为 Python 设计的堆栈分析工具,能够在不中断进程的情况下,深入分析运行中或崩溃的 Python 程序的线程状态、GIL 持有情况、局部变量等关键信息。其功能类似 Java 的 jstack,但针对 Python 生态进行了深度优化。
pip install pystack-debugger
依赖 gdb,需要先 yum install gdb
gputil 看N卡gpu利用率
https://github.com/anderskm/gputil
GPUtil是一个Python模块,用于从NVIDIA GPU获取GPU状态信息。它基于 nvidia-smi
工具,能够查找计算机上的所有GPU,确定其可用性,并返回有关GPU的详细信息。
注意:GPUtil依赖于 nvidia-smi 工具,因此在使用前需要确保 nvidia-smi 已正确安装并可用。
fitz/PyMuPDF 读pdf文件
pip install PyMuPDF
PyMuPDF 读取 pdf 文本:
def read_pdf_text(file_path):
with fitz.open(file_path) as pdf:
text = "".join(page.get_text() for page in pdf)
return text
page.search_for() 方法可直接定位文本的矩形区域。该方法的返回值为包含匹配区域的 Rect 对象列表
PDF 坐标系以页面左下角为原点,Y轴向上延伸(与图像坐标系相反)。若需转换为图像坐标系,可用 page.rect.height - rect.y1 调整Y值。
tika 读文档
pip install tika
from tika import parser
"""
提取word文档里面的内容
"""
def read_doc(file_path):
parsed = parser.from_file(file_path)
text = parsed['content']
return text
pillow 图像处理
pip install pillow
Faiss 向量检索库
https://github.com/facebookresearch/faiss
pip install faiss-cpu
FastAPI
pip install fastapi uvicorn
FastAPI 可以看做是 Starlette、Pydantic、OpenAPI 和 JSON Schema 粘合在一起:
- FastAPI 使用 Pydantic 进行数据验证,并使用 Starlette 作为工具,使其与 Flask 相比快得惊人,具有与 Node 或 Go 中的高速 Web APIs 相同的性能
- Starlette + Uvicorn 提供异步请求能力,这是 Flask 所缺乏的。
- 与 Flask 不同,FastAPI 没有内置的web服务器,因此需要像 Uvicorn 或 Daphne 这样的 ASGI 服务器。
Uvicorn 异步Web服务(ASGI)
pip install uvicorn
https://www.uvicorn.org/
https://github.com/encode/uvicorn
Uvicorn 是一个快速的 ASGI 服务器,用于构建异步 Web 服务。它基于 asyncio 库,支持高性能的异步请求处理,适用于各种类型的 Web 应用程序。
ASGI(Asynchronous Server Gateway Interface) 异步网关协议接口,一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 和 WebSocket。
Uvicorn 支持 HTTP 和 WebSocket 协议,可与各种 ASGI 应用程序框架(如 FastAPI、Django、Starlette 等)配合使用。
numpy安装
从 https://pypi.python.org/pypi/numpy 下载numpy-1.13.0
numpy和python是有版本对应关系的,由于我们的Python装的是python-3.5.3-amd64版,所以在这里要选用amd64并对应cp35,下载numpy-1.13.0-cp35-none-win_amd64.whl 安装包
CMD命令窗口中使用pip install
安装,如下:
C:\Users\User>pip install d:软件\\Python\\numpy-1.13.0-cp35-none-win_amd64.whl
Processing d:\软件\python\numpy-1.13.0-cp35-none-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.13.0
scipy安装
从 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载scipy-0.19.0 的Windows安装包 scipy-0.19.0-cp35-cp35m-win_amd64.whl
CMD命令窗口中使用pip install
安装,如下:
C:\Users\User>pip install d:软件\\Python\\scipy-0.19.0-cp35-cp35m-win_amd64.whl
Processing d:\软件\python\scipy-0.19.0-cp35-cp35m-win_amd64.whl
Requirement already satisfied: numpy>=1.8.2 in c:\users\User\appdata\local\programs\python\python35\lib\site-packages (from scipy==0.19.0)
Installing collected packages: scipy
Successfully installed scipy-0.19.0
安装成功后,在python环境下执行命令import scipy
,报错:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\User\AppData\Local\Programs\Python\Python35\lib\site-packages\scipy\__init__.py", line 61, in <module>
from numpy._distributor_init import NUMPY_MKL # requires numpy+mkl
ImportError: cannot import name 'NUMPY_MKL'
原因是安装的numpy中不包含MKL包,在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载Numpy+MKL安装包numpy-1.13.0+mkl-cp35-cp35m-win_amd64.whl,然后卸载刚安装的numpypip uninstall numpy-1.13.0-cp35-none-win_amd64.whl
重新安装numpy-1.13.0+mkl-cp35-cp35m-win_amd64.whl,
安装成功后,在python环境下执行命令import scipy
,成功。
https://www.zhihu.com/question/30188492/answer/125707763
scikit-learn安装
Scikit-learn requires:
Python (>= 2.6 or >= 3.3),
NumPy (>= 1.6.1),
SciPy (>= 0.9).
从 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载Scikit-learn-0.18.2 的Windows安装包 scikit_learn‑0.18.2‑cp35‑cp35m‑win_amd64.whl
CMD命令窗口中使用pip install
安装,如下:
C:\Users\User>pip install "d:软件\\Python\\scikit_learn-0.18.1-cp35-cp35m-win_amd64.whl"
Processing d:\软件\python\scikit_learn-0.18.1-cp35-cp35m-win_amd64.whl
Installing collected packages: scikit-learn
Successfully installed scikit-learn-0.18.1
安装成功后进入python命令行执行命令from sklearn import datasets
,不报错说明安装成功。
theano安装
在安装keras之前,要先安装numpy,scipy和theano,因为keras是基于theano向上开发的,所以要安装keras先安装theano。
从 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载Theano-0.9.0-py2.py3-none-any.whl安装
C:\Users\User>pip install "d:软件\\Python\\Theano-0.9.0-py2.py3-none-any.whl"
Processing d:\软件\python\theano-0.9.0-py2.py3-none-any.whl
Requirement already satisfied: scipy>=0.14 in c:\users\User\appdata\local\programs\python\python35\lib\site-packages (from Theano==0.9.0)
Requirement already satisfied: numpy>=1.9.1 in c:\users\User\appdata\local\programs\python\python35\lib\site-packages (from Theano==0.9.0)
Collecting six>=1.9.0 (from Theano==0.9.0)
Downloading six-1.10.0-py2.py3-none-any.whl
Installing collected packages: six, Theano
Successfully installed Theano-0.9.0 six-1.10.0
安装完在python命令行执行import theano
提示没有安装g++:
>>> import theano
WARNING (theano.configdefaults): g++ not available, if using conda: `conda install m2w64-toolchain`
WARNING (theano.configdefaults): g++ not detected ! Theano will be unable to execute optimized C-implementations (for both CPU and GPU) and will defau
lt to Python implementations. Performance will be severely degraded. To remove this warning, set Theano flags cxx to an empty string.
解决方法是安装MinGW,然后将mingw安装目录中的bin目录添加到PATH环境变量,因为里面有g++.exe
我本机已经安装了cygwin64,其中也有g++.exe,将其中的bin目录加入PATH环境变量也可以。
之后在python命令行执行import theano
报出一堆错误信息。
安装keras
安装tensorflow
Pandas
一、数据结构
Pandas 的主要数据结构是:
Series
一维数据DataFrame
二维数据
Series
一维带标签数组,支持多种数据类型
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
DataFrame
二维表格结构,支持列名定义和混合数据类型
data = {'姓名': ['张三', '李四'], '年龄': [28, 34]}
df = pd.DataFrame(data)
二、数据读写
CSV、Excel、SQL等多种格式的读取与保存
df = pd.read_csv('data.csv') # 读取CSV
df.to_excel('output.xlsx', index=False) # 保存Excel
三、数据清洗与处理
fillna 处理缺失值
fillna(value=’’, inplace=True) 缺失值替换为空字符串,原地修改
df.fillna({‘年龄’: df[‘年龄’].mean()}) 用均值填充
PEP-440 Python 包格式规范
PEP 440 – Version Identification and Dependency Specification
https://peps.python.org/pep-0440/
PEP 440 定义了 Python 软件包版本号的标准化格式,其核心由以下部分构成:[主版本号].[次版本号].[修订号][可选扩展标识]
其中:
- 主版本号(Major):表示重大更新(如不兼容的 API 变更),遵循语义化版本原则。
- 次版本号(Minor):新增向后兼容的功能性更新
- 修订号(Micro):修复向后兼容的错误或优化细节。
扩展标识
在基础版本号后,可通过扩展标识定义特殊版本状态:
- 预发布版本,例如
1.0.0a1
,2.3.0rc2
, 用于测试阶段(Alpha/Beta/候选发布),优先级低于正式版本。 - 开发版本,例如
0.5.0.dev3
表示开发中的未稳定代码,优先级低于预发布版本。 - 后发布版本,例如
1.2.0.post1
正式发布后的紧急修复版本,优先级高于开发版本。 - 本地版本,例如
1.0.0+local.2024
用于特定环境下的自定义构建(如内部测试),PyPI 不支持上传此类版本
版本号比较规则
PEP 440 定义了严格的版本优先级排序逻辑,确保依赖解析的准确性:
- 数值优先级:主/次/修订号按数值大小排序(例:1.9.0 < 1.10.0)。
- 预发布标识符:顺序为 a(Alpha) < b(Beta) < rc(候选),例如 1.0.0a2 < 1.0.0b1。
- 开发与后发布版:1.0.0.dev0 < 1.0.0a1 < 1.0.0 < 1.0.0.post1。
- 本地版本:本地标识符不参与优先级比较,仅用于环境区分
在 requirements.txt
中,可通过版本约束指定依赖范围:
requests>=2.26.0,<3.0.0 # 允许 2.26.0 到 3.0.0 之间的所有版本(不含 3.0.0)
numpy==1.21.* # 允许 1.21.x 的任意修订版本
上一篇 Python-爬虫
下一篇 Python-安装与环境配置
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: