Python新手必装的10个常用库:从requests到pandas
本文梳理Python新手在实际开发中最常接触的10个高频第三方库,涵盖网络请求、网页解析、数据分析、办公自动化与工程测试等核心场景,提供具体安装命令、典型代码范式及避坑指南。
准备工作:使用虚拟环境管理第三方依赖
在安装任何第三方库之前,直接向系统全局 Python 环境执行 pip install 是新手最容易犯的错误。全局安装会导致不同项目之间的版本相互冲突,甚至可能破坏操作系统的依赖。标准的工程实践是在项目根目录创建并激活独立的虚拟环境(virtual environment)。
执行以下命令即可在本地完成独立环境的初始化与激活:
# 1. 在当前项目目录下创建名为 .venv 的虚拟环境
python3 -m venv .venv
# 2. 激活虚拟环境
# macOS / Linux 系统:
source .venv/bin/activate
# Windows PowerShell:
# .venv\Scripts\Activate.ps1
# 3. 升级 pip 并验证当前环境
python -m pip install --upgrade pip
which python # Windows 下使用 where python
/Users/project/.venv/bin/python
Successfully upgraded pip to 24.x
(.venv) 字样。完成所有库的安装后,可通过 pip freeze > requirements.txt 锁定版本清单,后续只需执行 pip install -r requirements.txt 即可在另一台电脑上一键复现相同环境。
10大常用库的技术定位与领域划分
面对庞大的 PyPI 生态,盲目安装库会徒增维护成本。根据实际任务的目标,这 10 个库可以归入四个清晰的功能域:网络与数据采集、科学计算与数据分析、文件与多媒体处理,以及工程开发与调试测试。
Python 原生内置了 urllib.request,但其接口设计相对繁琐,处理 Cookie、编码推断以及 POST 参数时需要繁重的样板代码。requests 将复杂的底层传输封装为极度贴合人类阅读习惯的 API,是与后端接口通信、抓取网页数据的首选。
import requests
url = "https://httpbin.org/get"
params = {"category": "tutorial", "lang": "zh"}
try:
# 强烈建议显式指定 timeout 超时时间(单位:秒)
response = requests.get(url, params=params, timeout=5)
# 若返回状态码不是 200,将主动抛出 HTTPError 异常
response.raise_for_status()
# 自动解析 JSON 响应体
data = response.json()
print("请求URL:", data.get("url"))
print("客户端携带参数:", data.get("args"))
except requests.exceptions.RequestException as err:
print("网络请求失败:", err)
请求URL: https://httpbin.org/get?category=tutorial&lang=zh
客户端携带参数: {'category': 'tutorial', 'lang': 'zh'}
timeout 参数。若不指定超时时间,遇到对方服务器无响应或网络中断时,Python 进程会默认无限期阻塞挂起。
当通过 requests 拿到包含 HTML 源码的文本后,正则表达式并不适合解析嵌套深且容错要求高的网页结构。BeautifulSoup(常简写为 bs4)能够自动将凌乱的 HTML 修复并构建为树状节点对象,支持通过标签名、CSS 类名和属性灵活查找目标内容。
from bs4 import BeautifulSoup
html_doc = """
<div class="content">
<h1 class="title">文章列表</h1>
<ul class="articles">
<li><a href="/item/1" class="item">Python基础</a></li>
<li><a href="/item/2" class="item">Pandas数据清洗</a></li>
</ul>
</div>
"""
soup = BeautifulSoup(html_doc, "html.parser")
# 定位标题内容
title_text = soup.find("h1", class_="title").get_text()
print("页面主标题:", title_text)
# 抓取全部超链接与文本
for link in soup.find_all("a", class_="item"):
print(f"条目名称: {link.get_text()} | 目标地址: {link.get('href')}")
页面主标题: 文章列表
条目名称: Python基础 | 目标地址: /item/1
条目名称: Pandas数据清洗 | 目标地址: /item/2
class 是保留关键字,因此根据 CSS 类名查找时必须使用 class_="item"(带下划线),否则会触发语法错误。
原生 Python 列表(List)是通用动态对象,元素类型各异且分散存储在内存各处,在处理数十万个数值计算时效率较低。NumPy 提供了内存连续排布的 ndarray 对象以及底层由 C 编写的高性能矢量化运算,是 pandas、scikit-learn 以及众多深度学习框架不可或缺的底层依赖。
import numpy as np
# 创建一维数值数组
sales = np.array([120, 150, 90, 200, 180])
# 向量化运算:无需写 for 循环即可对整体进行批处理(如加收 10% 服务费)
adjusted_sales = sales * 1.1
print("原销售数据:", sales)
print("上浮后数据:", np.round(adjusted_sales, 1))
print(f"均值: {np.mean(sales)} | 标准差: {np.std(sales):.2f} | 最大值: {np.max(sales)}")
原销售数据: [120 150 90 200 180]
上浮后数据: [132. 165. 99. 220. 198. ]
均值: 148.0 | 标准差: 38.68 | 最大值: 200
for 循环中逐项累加,这会丧失底层 C 语言向量化带来的性能优势。
如果说 requests 解决了“数据从哪里来”,那么 pandas 解决的就是“数据如何整理与分析”。它核心的 DataFrame 类似一张功能强大的内存 Excel 表,内置了过滤、切片、空值填补、透视以及分组汇总(groupby)等高级数据操作能力。
import pandas as pd
# 模拟原始业务数据
records = [
{"dept": "技术部", "name": "张三", "salary": 16000, "city": "北京"},
{"dept": "市场部", "name": "李四", "salary": 11000, "city": "上海"},
{"dept": "技术部", "name": "王五", "salary": 18500, "city": "北京"},
{"dept": "市场部", "name": "赵六", "salary": 12500, "city": "深圳"},
{"dept": "运营部", "name": "孙七", "salary": 9500, "city": "上海"},
]
df = pd.DataFrame(records)
# 1. 过滤:筛选薪资大于 12000 的员工
high_earners = df[df["salary"] > 12000]
# 2. 聚合:按部门统计人数与平均薪资
summary = df.groupby("dept")["salary"].agg(["count", "mean"]).reset_index()
summary.rename(columns={"count": "人数", "mean": "平均薪资"}, inplace=True)
print("--- 薪资汇总表 ---")
print(summary.to_string(index=False))
--- 薪资汇总表 ---
dept 人数 平均薪资
市场部 2 11750.0
运营部 1 9500.0
技术部 2 17250.0
SettingWithCopyWarning 警告。进行衍生计算前,建议显式调用 .copy() 以区分视图与深拷贝。
数据流转闭环:从请求采集到图表落盘
单独了解一个库的作用通常并不足以解决复杂的业务问题。在实际开发中,这些库往往是紧密配合的流水线:先用 requests 拿到网络响应,用 BeautifulSoup 提取成结构化字典列表,送入 pandas 清洗计算,最后由 matplotlib 生成可视化报表图。
清洗整理好的数据需要直观向外展示。matplotlib(主要是其 pyplot 子模块)是 Python 中最稳健的基础绘图库,支持生成折线图、柱状图、散点图以及热力图,并能高质量导出为 PNG、PDF 或 SVG 格式。
import matplotlib.pyplot as plt
# 样本数据
months = ["1月", "2月", "3月", "4月", "5月"]
sales_volume = [120, 185, 140, 210, 260]
# 创建画布与子图
fig, ax = plt.subplots(figsize=(6, 3.5), dpi=100)
# 绘制折线与数据标记
ax.plot(months, sales_volume, marker="o", color="#52677D", linewidth=2, label="月销量")
ax.set_title("上半年产品月度销售趋势", fontsize=12)
ax.set_xlabel("月份")
ax.set_ylabel("销量 (万件)")
ax.grid(True, linestyle="--", alpha=0.5)
ax.legend()
# 保存图像至本地并关闭画布资源
plt.tight_layout()
plt.savefig("sales_trend.png")
plt.close()
print("图表已成功保存为 sales_trend.png")
图表已成功保存为 sales_trend.png
import matplotlib; matplotlib.use('Agg')。
日常办公中最常见的交付文件格式是 .xlsx。openpyxl 允许我们在未安装 Microsoft Office 的机器上,直接对 Excel 工作表进行精细化读写、公式填充和字体样式配置。
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
# 创建新的 Excel 工作簿
wb = Workbook()
ws = wb.active
ws.title = "季度业绩表"
# 写入表头并设置样式
headers = ["销售人员", "第一季度", "第二季度", "合计"]
ws.append(headers)
header_font = Font(name="微软雅黑", size=11, bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="52677D", end_color="52677D", fill_type="solid")
for col_idx in range(1, len(headers) + 1):
cell = ws.cell(row=1, column=col_idx)
cell.font = header_font
cell.fill = header_fill
cell.alignment = Alignment(horizontal="center")
# 追加数据行与 Excel 原生求和公式
ws.append(["李雷", 35000, 42000, "=SUM(B2:C2)"])
ws.append(["韩梅梅", 48000, 51000, "=SUM(B3:C3)"])
wb.save("季度业绩表.xlsx")
print("Excel 文件已生成:季度业绩表.xlsx")
Excel 文件已生成:季度业绩表.xlsx
openpyxl 专注于较新的 Office Open XML 格式(.xlsx),若需要读写极早期的 .xls 二进制文件,需使用 xlrd 或 xlwt。
在批量处理图片缩略图、调整分辨率或加盖水印时,直接使用庞大的 OpenCV 往往显得过重。Pillow(代码中导入为 PIL)支持数十种图像格式的读写、缩放、裁剪和色彩模式转换。
from PIL import Image
# 构造一个 200x200 像素的纯色测试图(RGB模式)
img = Image.new("RGB", (200, 200), color=(82, 103, 125))
# 等比例缩放为 100x100 的缩略图
img.thumbnail((100, 100))
# 转换格式并保存
img.save("thumbnail.jpg", "JPEG", quality=90)
print(f"图像生成完毕,尺寸: {img.size},格式: {img.format}")
图像生成完毕,尺寸: (100, 100),格式: JPEG
pip install pillow,而在 Python 代码中导入时必须使用 from PIL import Image,这是由于历史兼容原因保留的模块命名。
很多新手调试程序全靠原生 print(),当输出复杂的字典或列表时,控制台密密麻麻难以辨认。rich 支持在终端输出彩色文字、Markdown 格式、优雅的表格、JSON 高亮以及进度条,能够极大提升命令行交互与开发调试效率。
from rich.console import Console
from rich.table import Table
console = Console()
# 优雅打印带颜色与边框的终端表格
table = Table(title="服务运行状态监控")
table.add_column("服务名称", style="cyan", no_wrap=True)
table.add_column("端口", style="magenta")
table.add_column("健康状态", style="green")
table.add_row("API Gateway", "8080", "[green]Running[/green]")
table.add_row("Task Worker", "9090", "[green]Running[/green]")
table.add_row("Cache Redis", "6379", "[red]Down[/red]")
console.print(table)
服务运行状态监控
┏━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━┓
┃ 服务名称 ┃ 端口 ┃ 健康状态 ┃
┡━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━┩
│ API Gateway │ 8080 │ Running │
│ Task Worker │ 9090 │ Running │
│ Cache Redis │ 6379 │ Down │
└──────────────┴──────┴──────────┘
代码是否真正正常工作,不能仅靠肉眼观察控制台打印。Python 内置的 unittest 要求编写类并继承指定基类,写法繁琐。pytest 允许直接编写普通的函数,直接使用原生的 assert 关键字,并能自动发现项目中所有以 test_*.py 命名的测试用例。
# 业务函数与对应测试用例(保存为 test_math_util.py)
def calc_discount(price: float, discount: float) -> float:
if discount <= 0 or discount > 1:
raise ValueError("折扣必须在 0 到 1 之间")
return round(price * discount, 2)
def test_calc_discount_normal():
# 使用原生 assert,断言失败时 pytest 会智能打印变量差值
assert calc_discount(100.0, 0.8) == 80.0
assert calc_discount(250.0, 0.75) == 187.5
def test_calc_discount_invalid():
import pytest
with pytest.raises(ValueError):
calc_discount(100.0, 1.5)
pytest -v==================== test session starts ====================
collected 2 items
test_math_util.py::test_calc_discount_normal PASSED [ 50%]
test_math_util.py::test_calc_discount_invalid PASSED [100%]
==================== 2 passed in 0.02s ====================
将数据库密码、API Key 等机密信息硬编码进代码是非常危险的行为,一旦代码提交至 Git 仓库就会造成凭据泄露。python-dotenv 允许在项目根目录创建一个不提交给 Git 的 .env 文件,并在代码启动时自动将其注入到系统环境变量中。
# 1. 本地根目录下创建 .env 文件,写入如下键值:
# DATABASE_URL=mysql://admin:secret123@localhost:3306/prod
# API_SECRET=sk-998877665544332211
import os
from dotenv import load_dotenv
# 加载当前目录下的 .env 文件
load_dotenv()
# 通过 os.getenv 统一安全读取配置
db_url = os.getenv("DATABASE_URL", "sqlite:///default.db")
api_key = os.getenv("API_SECRET")
print("数据库连接串:", db_url)
print("密钥已加载:", bool(api_key))
数据库连接串: mysql://admin:secret123@localhost:3306/prod
密钥已加载: True
.gitignore 文件中显式添加 .env,严防配置文件被随手提交到远程代码托管平台。
任务驱动选型指南与常见问题速查
初学者面对不同场景时,常会纠结具体使用哪个库。以下决策表列举了常见业务任务与最优解库的对照匹配:
新手高频疑问与实操建议
-
这么多库,需要一次性全部安装吗?
不建议一次性全部安装。虽然这 10 个库体积相对适中,但最佳做法始终是根据当前项目需求逐步引入。例如编写爬虫时仅需pip install requests beautifulsoup4;处理报表数据时再装pandas openpyxl。 -
安装包时下载特别慢甚至超时,如何解决?
这通常是因为访问官方海外源网络受限。可以配置国内镜像源来加速下载,例如临时指定镜像源安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests -
为什么在代码里 import 会提示 ModuleNotFoundError?
十有八九是因为运行代码的 Python 解释器与执行 pip 安装的解释器不是同一个。务必检查当前终端是否已激活对应的(.venv)虚拟环境,并使用which python与which pip核对路径一致性。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









