Python常用第三方库速查:requests、click、rich……这些库让你少写80%代码
Python拥有丰富的第三方库生态系统,可以大大提高开发效率。本篇介绍各领域常用的第三方库,帮助你快速找到合适的工具。
1. 数据处理
NumPy - 数值计算
pip install numpy
import numpy as np
# 数组操作
arr = np.array([1, 2, 3, 4, 5])
print(arr.mean()) # 平均值
print(arr.std()) # 标准差
# 矩阵运算
matrix = np.array([[1, 2], [3, 4]])
print(np.dot(matrix, matrix)) # 矩阵乘法
Pandas - 数据分析
pip install pandas
import pandas as pd
# 读取数据
df = pd.read_csv('data.csv')
df = pd.read_excel('data.xlsx')
# 数据操作
df.head() # 前5行
df.describe() # 统计摘要
df['column'].mean() # 列平均值
df.groupby('category').sum() # 分组聚合
# 数据清洗
df.dropna() # 删除空值
df.fillna(0) # 填充空值
df.drop_duplicates() # 删除重复
Matplotlib - 数据可视化
pip install matplotlib
import matplotlib.pyplot as plt
# 折线图
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('示例图')
plt.show()
# 柱状图
plt.bar(['A', 'B', 'C'], [10, 20, 15])
plt.show()
2. 网络请求
Requests - HTTP请求
pip install requests
import requests
# GET请求
response = requests.get('https://api.example.com/data')
print(response.status_code)
print(response.json())
# POST请求
data = {'key': 'value'}
response = requests.post('https://api.example.com/submit', json=data)
# 带参数
params = {'page': 1, 'limit': 10}
response = requests.get('https://api.example.com/list', params=params)
# 带请求头
headers = {'Authorization': 'Bearer token123'}
response = requests.get('https://api.example.com/protected', headers=headers)
# 超时设置
response = requests.get('https://api.example.com', timeout=5)
# 会话保持
session = requests.Session()
session.headers.update({'User-Agent': 'MyApp/1.0'})
response = session.get('https://api.example.com')
httpx - 异步HTTP
pip install httpx
import httpx
import asyncio
# 同步使用
response = httpx.get('https://api.example.com')
# 异步使用
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get('https://api.example.com')
return response.json()
# asyncio.run(fetch_data())
3. 文件处理
openpyxl - Excel操作
pip install openpyxl
from openpyxl import Workbook, load_workbook
# 创建Excel
wb = Workbook()
ws = wb.active
ws['A1'] = 'Hello'
ws.append([1, 2, 3])
wb.save('output.xlsx')
# 读取Excel
wb = load_workbook('data.xlsx')
ws = wb.active
for row in ws.iter_rows(values_only=True):
print(row)
python-docx - Word操作
pip install python-docx
from docx import Document
# 创建Word
doc = Document()
doc.add_heading('标题', 0)
doc.add_paragraph('正文内容')
doc.save('output.docx')
# 读取Word
doc = Document('input.docx')
for para in doc.paragraphs:
print(para.text)
PyPDF2 - PDF操作
pip install PyPDF2
from PyPDF2 import PdfReader, PdfWriter
# 读取PDF
reader = PdfReader('input.pdf')
for page in reader.pages:
print(page.extract_text())
# 合并PDF
writer = PdfWriter()
for pdf_file in ['file1.pdf', 'file2.pdf']:
reader = PdfReader(pdf_file)
for page in reader.pages:
writer.add_page(page)
writer.write('merged.pdf')
Pillow - 图像处理
pip install Pillow
from PIL import Image
# 打开图片
img = Image.open('image.jpg')
# 调整大小
img_resized = img.resize((800, 600))
# 裁剪
img_cropped = img.crop((100, 100, 400, 400))
# 旋转
img_rotated = img.rotate(90)
# 保存
img_resized.save('output.jpg', quality=85)
# 格式转换
img.save('output.png')
4. 数据库
SQLite(内置)
import sqlite3
# 连接数据库
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
''')
# 插入数据
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('张三', 25))
conn.commit()
# 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
SQLAlchemy - ORM
pip install sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# 创建引擎
engine = create_engine('sqlite:///database.db')
Base.metadata.create_all(engine)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
# 添加数据
user = User(name='张三', age=25)
session.add(user)
session.commit()
# 查询数据
users = session.query(User).filter(User.age > 20).all()
for user in users:
print(user.name, user.age)
5. 命令行工具
argparse(内置)
import argparse
parser = argparse.ArgumentParser(description='示例程序')
parser.add_argument('input', help='输入文件')
parser.add_argument('-o', '--output', default='output.txt', help='输出文件')
parser.add_argument('-v', '--verbose', action='store_true', help='详细输出')
parser.add_argument('-n', '--number', type=int, default=10, help='数量')
args = parser.parse_args()
print(f"输入: {args.input}")
print(f"输出: {args.output}")
Click - 命令行框架
pip install click
import click
@click.command()
@click.argument('name')
@click.option('--count', default=1, help='重复次数')
@click.option('--shout/--no-shout', default=False)
def hello(name, count, shout):
"""简单的问候程序"""
for _ in range(count):
message = f'Hello, {name}!'
if shout:
message = message.upper()
click.echo(message)
if __name__ == '__main__':
hello()
Rich - 美化输出
pip install rich
from rich.console import Console
from rich.table import Table
from rich.progress import track
import time
console = Console()
# 彩色输出
console.print("Hello", style="bold red")
console.print("[green]成功[/green] 操作完成")
# 表格
table = Table(title="用户列表")
table.add_column("ID", style="cyan")
table.add_column("姓名", style="magenta")
table.add_column("年龄", style="green")
table.add_row("1", "张三", "25")
table.add_row("2", "李四", "30")
console.print(table)
# 进度条
for _ in track(range(100), description="处理中..."):
time.sleep(0.01)
tqdm - 进度条
pip install tqdm
from tqdm import tqdm
import time
# 基本使用
for i in tqdm(range(100)):
time.sleep(0.01)
# 自定义描述
for i in tqdm(range(100), desc="下载中"):
time.sleep(0.01)
# 手动更新
with tqdm(total=100) as pbar:
for i in range(10):
time.sleep(0.1)
pbar.update(10)
6. 日期时间
arrow - 日期时间处理
pip install arrow
import arrow
# 当前时间
now = arrow.now()
print(now)
# 时区转换
utc = arrow.utcnow()
local = utc.to('Asia/Shanghai')
# 格式化
print(now.format('YYYY-MM-DD HH:mm:ss'))
# 人性化显示
print(now.humanize(locale='zh')) # "刚刚"
# 时间计算
tomorrow = now.shift(days=1)
last_week = now.shift(weeks=-1)
# 解析
dt = arrow.get('2024-01-15', 'YYYY-MM-DD')
pendulum - 日期时间
pip install pendulum
import pendulum
# 当前时间
now = pendulum.now()
now_utc = pendulum.now('UTC')
# 创建日期
dt = pendulum.datetime(2024, 1, 15, 12, 30)
# 时间差
diff = now.diff(dt)
print(diff.in_days())
print(diff.in_hours())
# 人性化
print(now.diff_for_humans()) # "几秒前"
7. 配置管理
python-dotenv - 环境变量
pip install python-dotenv
# .env 文件
# DATABASE_URL=sqlite:///db.sqlite
# SECRET_KEY=your-secret-key
# DEBUG=true
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件
database_url = os.getenv('DATABASE_URL')
secret_key = os.getenv('SECRET_KEY')
debug = os.getenv('DEBUG', 'false').lower() == 'true'
PyYAML - YAML配置
pip install pyyaml
import yaml
# 读取YAML
with open('config.yaml', 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
print(config['database']['host'])
# 写入YAML
data = {
'database': {
'host': 'localhost',
'port': 3306
}
}
with open('output.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data, f, allow_unicode=True)
Pydantic - 数据验证
pip install pydantic
from pydantic import BaseModel, validator
from typing import Optional
class User(BaseModel):
name: str
age: int
email: Optional[str] = None
@validator('age')
def age_must_be_positive(cls, v):
if v < 0:
raise ValueError('年龄必须为正数')
return v
# 创建实例(自动验证)
user = User(name='张三', age=25)
print(user.model_dump()) # {'name': '张三', 'age': 25, 'email': None}
# 从字典创建
data = {'name': '李四', 'age': 30, 'email': '[email protected]'}
user = User(**data)
8. 测试工具
pytest - 测试框架
pip install pytest
# test_example.py
import pytest
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
def test_add_strings():
assert add('hello', ' world') == 'hello world'
# 参数化测试
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
])
def test_add_parametrized(a, b, expected):
assert add(a, b) == expected
# 异常测试
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
1 / 0
# 运行: pytest test_example.py -v
unittest.mock - 模拟
from unittest.mock import Mock, patch, MagicMock
# 创建Mock对象
mock = Mock()
mock.method.return_value = 42
print(mock.method()) # 42
# 使用patch
def get_data():
import requests
return requests.get('https://api.example.com').json()
@patch('requests.get')
def test_get_data(mock_get):
mock_get.return_value.json.return_value = {'key': 'value'}
result = get_data()
assert result == {'key': 'value'}
9. 实用工具
pathlib - 路径处理(内置)
from pathlib import Path
# 路径操作
path = Path('folder/file.txt')
print(path.name) # file.txt
print(path.stem) # file
print(path.suffix) # .txt
print(path.parent) # folder
# 路径拼接
new_path = path.parent / 'new_file.txt'
# 遍历目录
for file in Path('.').glob('*.py'):
print(file)
# 读写文件
content = Path('file.txt').read_text(encoding='utf-8')
Path('output.txt').write_text('Hello', encoding='utf-8')
loguru - 日志
pip install loguru
from loguru import logger
# 基本使用
logger.debug("调试信息")
logger.info("一般信息")
logger.warning("警告")
logger.error("错误")
# 输出到文件
logger.add("file.log", rotation="10 MB")
# 带变量
name = "张三"
logger.info(f"用户 {name} 登录")
# 异常记录
try:
1 / 0
except Exception:
logger.exception("发生异常")
schedule - 任务调度
pip install schedule
import schedule
import time
def job():
print("执行任务")
# 定时任务
schedule.every(10).seconds.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
while True:
schedule.run_pending()
time.sleep(1)
10. 总结
🔑 常用库速查表
| 领域 | 库 | 用途 |
|---|---|---|
| 数据处理 | numpy, pandas | 数值计算、数据分析 |
| 可视化 | matplotlib, seaborn | 图表绑制 |
| 网络请求 | requests, httpx | HTTP客户端 |
| Excel | openpyxl, pandas | Excel读写 |
| Word | python-docx | Word文档 |
| PyPDF2, pdfplumber | PDF处理 | |
| 图像 | Pillow, opencv | 图像处理 |
| 数据库 | sqlalchemy | ORM |
| 命令行 | click, argparse | CLI工具 |
| 日期时间 | arrow, pendulum | 日期处理 |
| 配置 | pydantic, python-dotenv | 配置管理 |
| 测试 | pytest | 单元测试 |
| 日志 | loguru | 日志记录 |
✅ 学习检查清单
- 了解数据处理库(numpy, pandas)
- 会使用requests发送HTTP请求
- 能处理Excel/Word文件
- 了解命令行工具库
- 会使用pytest编写测试
📖 下一步学习
了解了常用第三方库后,让我们学习项目打包与发布:
常见问题 FAQ
💬 怎么判断一个第三方库是否靠谱?
看PyPI下载量、GitHub星数、最近更新时间、文档质量。下载量>100万/月、最近3个月有更新、有完整文档的库基本靠谱。
💬 pip和uv怎么选?
uv是Rust实现的包管理器,速度比pip快10-100倍,且内置虚拟环境管理。新项目推荐uv,老项目继续用pip也没问题。
📘 系列导航
- 上一篇:30 - Python代码规范与最佳实践
- 当前:31 - Python常用第三方库
- 下一篇:32 - Python项目打包与发布