当前位置 : 首页 » 文章分类 :  开发  »  Python-常用模块

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.comwww.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.call
subprocess.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.run
subprocess.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,则 stdoutstderr 会被捕获,并作为 CompletedProcess 实例的属性返回。这与设置 stdout=PIPEstderr=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=Truestdout=PIPE)。
  • stderr 标准错误的内容(如果 capture_output=Truestdout=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,然后卸载刚安装的numpy
pip 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-安装与环境配置

阅读
评论
5.4k
阅读预计23分钟
创建日期 2024-12-18
修改日期 2025-03-15
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论