Python 使用库入门:从标准库、第三方库到打包发布

文章目录
- Python 使用库入门:从标准库、第三方库到打包发布
- 前言
- 一、什么是库?
- 二、标准库和第三方库
- 三、模块、包和库有什么区别?
- 四、使用 import 导入模块
- 五、from import:只导入需要的内容
- 六、as:给模块起别名
- 七、标准库示例一:日期计算 datetime
- 八、内置类型的方法也是“现成工具”
- 九、标准库示例二:文件查找工具 os.walk
- 十、第三方库从哪里来?
- 十一、使用 pip 安装第三方库
- 十二、第三方库示例一:生成二维码 qrcode
- 十三、第三方库示例二:操作 Excel
- 十四、第三方库示例三:程序员鼓励师
- 十五、综合案例:命令行学生管理系统
- 十六、学生管理系统:基本框架
- 十七、实现新增学生
- 十八、显示学生
- 十九、查找学生
- 二十、删除学生
- 二十一、加入文件存档
- 二十二、实现读档函数
- 二十三、打包成 exe 程序
- 二十四、使用库时的几个建议
- 总结
前言
刚开始学 Python 的时候,我们经常会把重点放在语法上,比如变量、循环、函数、列表、字典这些内容。
这些当然很重要,但真正写程序时,你会很快发现:光会语法还不够。
比如现在有几个需求:
- 计算两个日期之间相差多少天
- 批量查找某个文件夹下的文件
- 生成一个二维码
- 读取 Excel 表格里的数据
- 监听键盘按键并播放提示音
- 把写好的 Python 程序打包成 exe
如果每个功能都从零开始写,难度会非常高,效率也很低。
这时候就要用到 Python 的“库”。
简单来说:
库就是别人已经写好的代码,我们可以直接拿来使用。
这也是 Python 非常受欢迎的原因之一。Python 语法本身比较简洁,同时还有非常丰富的标准库和第三方库。很多时候,我们不需要重复造轮子,而是要学会找到合适的轮子,并把它用好。
一、什么是库?
库可以理解为一批提前写好的代码集合。
比如你要处理日期,不需要自己去判断闰年、月份天数、日期差值,Python 已经提供了 datetime。
比如你要遍历文件夹,不需要自己从操作系统底层开始写,Python 已经提供了 os。
比如你要生成二维码,也不需要自己研究二维码编码规则,可以直接使用第三方库 qrcode。
这就是使用库的意义:
把常见、通用、成熟的功能封装起来,需要时直接调用。
正所谓:
君子性非异也,善假于物也。
写程序也是一样。优秀的程序员并不是所有代码都自己手写,而是知道什么时候该自己实现,什么时候该合理利用现成工具。

二、标准库和第三方库
按照来源不同,Python 的库大致可以分成两类:
- 标准库
- 第三方库
1. 标准库
标准库就是 Python 自带的库。
只要你安装了 Python,就可以直接使用这些库,不需要额外安装。
常见标准库包括:
datetime 处理日期和时间
os 操作系统相关功能
sys Python 解释器相关功能
math 数学计算
random 随机数
json JSON 数据处理
threading 多线程
sqlite3 操作 SQLite 数据库
pathlib 面向对象的路径操作
标准库的特点是:
- 稳定
- 官方维护
- 不需要额外安装
- 适合解决很多常见问题
2. 第三方库
第三方库就是 Python 官方之外的人、组织或者公司写好的库。
比如:
requests 网络请求
numpy 数值计算
pandas 表格数据处理
matplotlib 数据可视化
qrcode 生成二维码
openpyxl 读写 Excel xlsx 文件
pyinstaller 打包 Python 程序
第三方库的特点是:
- 数量非常多
- 覆盖领域很广
- 通常需要额外安装
- 质量参差不齐,需要学会选择
Python 的强大,很大一部分就来自第三方库生态。
、
三、模块、包和库有什么区别?
初学时经常会混淆这几个概念。
1. 模块 module
模块通常就是一个 .py 文件。
比如你写了一个文件:
tools.py
它里面定义了函数、变量、类,那么这个文件就可以看成一个模块。
在另一个文件中可以这样导入:
import tools
2. 包 package
包可以理解为一组模块的集合。
通常一个文件夹中包含 __init__.py,就可以被 Python 当成包来处理。
比如:
my_package/
__init__.py
file_tools.py
string_tools.py
这就是一个包。
3. 库 library
库是一个更宽泛的说法。
一个库可能只是一个模块,也可能是一个包,还可能包含很多子包、文档和工具。
日常交流中,我们不必把这几个词抠得太死。可以先这样理解:
模块:一个 .py 文件
包:多个模块组织成的文件夹
库:可以被我们复用的一套代码
四、使用 import 导入模块
Python 使用 import 导入模块。
基本写法:
import 模块名
例如导入 datetime:
import datetime
导入后,可以通过:
模块名.成员
来使用里面的功能。

比如:
import datetime
date1 = datetime.datetime(2012, 2, 14)
date2 = datetime.datetime(2022, 7, 12)
print(date2 - date1)
这里:
datetime.datetime(2012, 2, 14)
第一个 datetime 是模块名,第二个 datetime 是模块里的类名。
这段代码会输出两个日期之间相差的时间。

五、from import:只导入需要的内容
除了 import 模块名,也可以使用:
from 模块名 import 成员名
比如:
from datetime import datetime
date1 = datetime(2012, 2, 14)
date2 = datetime(2022, 7, 12)
print(date2 - date1)
这种写法的好处是代码更短。
原来要写:
datetime.datetime(...)
现在只需要写:
datetime(...)
不过也要注意,from import 用多了,名字可能会混乱。初学阶段建议优先使用:
import 模块名
这种写法虽然稍微长一点,但来源更清楚。
六、as:给模块起别名
有些模块名比较长,或者大家已经形成了固定习惯,就会使用 as 起别名。
例如:
import numpy as np
import pandas as pd
as 的意思是“作为”。
import datetime as dt
date1 = dt.datetime(2012, 2, 14)
date2 = dt.datetime(2022, 7, 12)
print(date2 - date1)
这个写法在数据分析、机器学习领域非常常见。
不过别名不要乱起。比如:
import datetime as d
虽然能运行,但可读性并不好。别人看到 d.datetime(...),还要猜 d 是什么。
七、标准库示例一:日期计算 datetime
datetime 是 Python 标准库中处理日期和时间的模块。
假设我们想计算两个日期相差多少天:
import datetime
date1 = datetime.datetime(2012, 2, 14)
date2 = datetime.datetime(2022, 7, 12)
delta = date2 - date1
print(delta)
print(delta.days)
输出大致是:
3801 days, 0:00:00
3801
date2 - date1 得到的是一个时间差对象。
如果只想要相差的天数,可以使用:
delta.days
这个例子体现了使用库的价值。
如果不用 datetime,我们可能要自己处理:
- 每个月多少天
- 闰年怎么算
- 日期跨年怎么办
- 两个日期谁在前谁在后
这会让一个很简单的需求变得麻烦。
八、内置类型的方法也是“现成工具”
有些功能甚至不需要导入模块,因为 Python 的内置类型已经自带很多方法。
比如字符串 str。
1. 翻转句子中的单词顺序
题目:
输入:"I am a student."
输出:"student. a am I"
可以这样写:
def reverse_words(s):
words = s.split()
words.reverse()
return ' '.join(words)
print(reverse_words('I am a student.'))
这里用到了三个常见方法:
split()
reverse()
join()
拆开看:
s.split()
把字符串按照空白字符切成列表:
['I', 'am', 'a', 'student.']
然后:
words.reverse()
把列表原地反转:
['student.', 'a', 'am', 'I']
最后:
' '.join(words)
用空格把列表拼回字符串:
student. a am I

2. 判断旋转字符串
题目:
s = "abcde"
goal = "cdeab"
如果不断把 s 左边第一个字符移动到最右边,能不能得到 goal?
一个很巧的写法是:
def rotate_string(s, goal):
return len(s) == len(goal) and goal in s + s
print(rotate_string('abcde', 'cdeab'))
为什么这样可以?
假设:
s = "abcde"
那么:
s + s = "abcdeabcde"
所有旋转结果都会出现在 s + s 里。
例如:
abcde
bcdea
cdeab
deabc
eabcd
所以只需要判断 goal 是否是 s + s 的子串。
3. 判断字符串前缀
def count_prefixes(words, s):
count = 0
for word in words:
if s.startswith(word):
count += 1
return count
print(count_prefixes(["a", "b", "c", "ab", "bc", "abc"], "abc"))
startswith() 可以判断一个字符串是否以另一个字符串开头。
这类方法非常实用,平时写代码时应该多积累。
九、标准库示例二:文件查找工具 os.walk
如果我们想在某个目录下查找文件名中包含关键字的文件,可以使用 os.walk。
os.walk 会递归遍历一个目录,并返回三部分信息:
当前路径
当前路径下的目录列表
当前路径下的文件列表
示例代码:
import os
input_path = input('请输入待搜索路径: ')
pattern = input('请输入待搜索关键词: ')
for dirpath, dirnames, filenames in os.walk(input_path):
for filename in filenames:
if pattern in filename:
print(os.path.join(dirpath, filename))
这里建议使用:
os.path.join(dirpath, filename)
而不是手动写:
dirpath + '/' + filename
原因是不同操作系统路径分隔符可能不同。
Windows 常见路径是:
D:\test\demo.txt
Linux/macOS 常见路径是:
/home/user/demo.txt
os.path.join 能帮我们更稳妥地拼接路径。
如果你使用的是较新的 Python,也可以考虑 pathlib,它的写法更现代:
from pathlib import Path
input_path = Path(input('请输入待搜索路径: '))
pattern = input('请输入待搜索关键词: ')
for file in input_path.rglob('*'):
if file.is_file() and pattern in file.name:
print(file)
pathlib 把路径当成对象来处理,代码可读性更好。

十、第三方库从哪里来?
标准库已经很强,但它不可能覆盖所有需求。
比如:
- 生成二维码
- 处理 Excel
- 做爬虫
- 做数据分析
- 做机器学习
- 做 Web 后端
- 做自动化办公
这些场景通常会用到第三方库。
第三方库一般发布在 PyPI 上。
可以把 PyPI 理解成 Python 的“应用商店”。别人写好的库发布到 PyPI,我们通过 pip 安装,就可以在自己的项目里使用。
十一、使用 pip 安装第三方库
pip 是 Python 常用的包管理工具。
最基本写法:
pip install 库名
比如安装 qrcode:
pip install qrcode
如果需要带图片处理支持,可以安装:
pip install "qrcode[pil]"
在 Windows 的命令行中,如果遇到引号问题,也可以尝试:
pip install qrcode[pil]

1. 推荐使用 python -m pip
有时候电脑上装了多个 Python 版本,直接执行 pip 可能会装到另一个 Python 环境里。
更稳妥的写法是:
python -m pip install 库名
比如:
python -m pip install qrcode[pil]
这样可以明确使用当前 python 对应的 pip。
2. pip 不是内部或外部命令怎么办?
如果命令行提示:
'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
常见原因是 Python 或 pip 没有加入环境变量。
可以尝试:
python -m pip --version
如果这个能运行,就说明 pip 本身存在,只是 pip 命令没有直接加入 PATH。
如果连 python 也找不到,可能需要重新安装 Python,并勾选:
Add Python to PATH
十二、第三方库示例一:生成二维码 qrcode
现在我们用 qrcode 生成一个二维码。
1. 安装
python -m pip install qrcode[pil]
2. 编写代码
import qrcode
img = qrcode.make('Hello Python')
img.save('qrcode.png')
运行后,会在当前目录下生成:
qrcode.png
二维码本质上可以理解为:
用黑白点阵保存一段字符串信息。
这段字符串可以是普通文本,也可以是一个网址。
比如:
import qrcode
url = 'https://www.example.com'
img = qrcode.make(url)
img.save('site.png')
扫码后,很多软件会自动识别为链接并跳转。
3. 更完整一点的写法
如果想设置二维码大小、边框等参数,可以这样写:
import qrcode
qr = qrcode.QRCode(
version=1,
box_size=10,
border=4
)
qr.add_data('Hello Python')
qr.make(fit=True)
img = qr.make_image(fill_color='black', back_color='white')
img.save('qrcode.png')
初学阶段先掌握 qrcode.make() 就够了,后面需要自定义样式时再查文档。
十三、第三方库示例二:操作 Excel
Python 操作 Excel 是非常常见的自动化办公场景。
原文中使用了 xlrd 读取 Excel。这里要特别提醒一点:
新版本
xlrd主要用于读取.xls文件。如果要读取.xlsx,更推荐使用openpyxl;如果必须使用原文中的xlrd读取.xlsx,需要指定旧版本xlrd==1.2.0。
1. 使用 xlrd 读取 xlsx 的旧写法
安装:
python -m pip install xlrd==1.2.0
假设表格内容如下:
| 姓名 | 班级 | 分数 |
|---|---|---|
| 张三 | 100 | 68 |
| 李四 | 100 | 76 |
| 王五 | 100 | 74 |
| 赵六 | 101 | 89 |
| 田七 | 101 | 75 |
| 周八 | 100 | 90 |
| 刘九 | 101 | 57 |
需求:求 100 班的平均分。
示例代码:
import xlrd
xlsx = xlrd.open_workbook('d:/test.xlsx')
table = xlsx.sheet_by_index(0)
nrows = table.nrows
count = 0
total = 0
for i in range(1, nrows):
class_id = table.cell_value(i, 1)
score = table.cell_value(i, 2)
if class_id == 100:
total += score
count += 1
print(f'平均分: {total / count}')
这里用到的核心接口:
open_workbook() 打开 Excel 文件
sheet_by_index(0) 获取第 0 个工作表
table.nrows 获取行数
cell_value(row, col) 获取指定单元格数据
2. 更推荐的新写法:openpyxl
现在处理 .xlsx,更推荐使用 openpyxl。
安装:
python -m pip install openpyxl
代码示例:
from openpyxl import load_workbook
wb = load_workbook('d:/test.xlsx')
sheet = wb.active
count = 0
total = 0
for row in range(2, sheet.max_row + 1):
class_id = sheet.cell(row=row, column=2).value
score = sheet.cell(row=row, column=3).value
if class_id == 100:
total += score
count += 1
print(f'平均分: {total / count}')
如果你只是初学,先理解思路即可:
打开文件 -> 获取工作表 -> 遍历行 -> 读取单元格 -> 计算结果
十四、第三方库示例三:程序员鼓励师
这个例子比较有趣:监听键盘按键,每按一定次数,就播放一个提示音,鼓励一下正在写代码的自己。
需要两个库:
pynput 监听键盘
playsound 播放音频
安装:
python -m pip install pynput==1.6.8
python -m pip install playsound==1.2.2
准备一个音频文件:
ding.mp3
放在 Python 文件同级目录下。
基础代码:
from pynput import keyboard
from playsound import playsound
count = 0
def on_release(key):
global count
print(key)
count += 1
if count % 10 == 0:
playsound('ding.mp3')
listener = keyboard.Listener(on_release=on_release)
listener.start()
listener.join()
这段代码的逻辑是:
监听按键释放事件
每释放一次按键,count 加 1
当 count 是 10 的倍数时,播放音频
使用多线程避免卡顿
上面的代码有一个问题:播放音频时可能会阻塞当前流程,导致按键监听短暂卡顿。
可以使用 threading.Thread 改进:
from pynput import keyboard
from playsound import playsound
from threading import Thread
count = 0
def on_release(key):
global count
print(key)
count += 1
if count % 10 == 0:
t = Thread(target=playsound, args=('ding.mp3',))
t.start()
listener = keyboard.Listener(on_release=on_release)
listener.start()
listener.join()
这里:
Thread(target=playsound, args=('ding.mp3',))
表示创建一个新线程来执行:
playsound('ding.mp3')
这样播放音频不会明显影响主线程监听键盘。
十五、综合案例:命令行学生管理系统
前面我们讲了库的使用,现在用一个综合案例把内容串起来。
需求:实现一个命令行版本的学生管理系统。
功能包括:
1. 新增学生
2. 显示学生
3. 查找学生
4. 删除学生
5. 存档到文件
0. 退出程序
学生信息可以用字典表示:
student = {
'studentId': '001',
'name': '张三',
'gender': '男',
'className': '100'
}
所有学生用列表保存:
students = []
十六、学生管理系统:基本框架
先写主函数和菜单函数。
import sys
students = []
def menu():
print()
print("1. 新增学生信息")
print("2. 显示所有学生信息")
print("3. 根据姓名查找学生信息")
print("4. 删除学生信息")
print("0. 退出程序")
choice = input("请输入您的选择: ")
return int(choice)
def main():
print('+--------------------------+')
print('| 欢迎来到学生管理系统 |')
print('+--------------------------+')
while True:
choice = menu()
if choice == 0:
sys.exit()
elif choice == 1:
insert()
elif choice == 2:
show()
elif choice == 3:
find()
elif choice == 4:
delete()
else:
print('输入有误,请重新输入!')
这里使用了标准库 sys。
sys.exit()
可以让程序退出。
十七、实现新增学生
def insert():
print("[新增学生] 开始!")
student_id = input("请输入学生的学号: ")
name = input("请输入学生的姓名: ")
gender = input("请输入学生的性别: ")
if gender not in ('男', '女'):
print("性别不符合要求,新增学生失败!")
return
class_name = input("请输入学生的班级: ")
student = {
'studentId': student_id,
'name': name,
'gender': gender,
'className': class_name
}
students.append(student)
print("[新增学生] 完毕!")
这里学生信息使用字典保存,然后添加到全局列表 students 中。
十八、显示学生
def show():
print("[显示学生] 开始!")
for s in students:
print(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}")
print(f"[显示学生] 完毕!共显示 {len(students)} 条记录。")
\t 是制表符,可以让输出更整齐。
十九、查找学生
def find():
print("[查找学生] 开始!")
name = input("请输入要查找的学生姓名: ")
count = 0
for s in students:
if name == s['name']:
print(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}")
count += 1
print(f"[查找学生] 完毕!共查找到 {count} 条记录。")
查找的本质就是遍历列表,判断字典中的某个字段是否符合要求。
二十、删除学生
def delete():
print("[删除学生] 开始!")
student_id = input("请输入要删除的学生学号: ")
count = 0
for s in students[:]:
if student_id == s['studentId']:
print(f"删除 {s['name']} 同学的信息!")
students.remove(s)
count += 1
print(f"[删除学生] 完毕!共删除 {count} 条记录。")
这里注意:
for s in students[:]:
使用的是列表切片副本。
为什么不直接写:
for s in students:
因为一边遍历列表,一边删除列表中的元素,容易导致遍历过程出问题。用副本遍历会更稳妥。
二十一、加入文件存档
如果只把学生信息放在列表里,程序一结束,数据就没了。
所以我们需要把数据保存到文件中。
约定保存到:
d:/record.txt
每个学生一行,字段之间用 \t 分隔:
001 张三 男 100
002 李四 女 101
1. 存档函数 save
def save():
with open('d:/record.txt', 'w', encoding='utf-8') as f:
for s in students:
f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n")
print(f"[存档成功] 共存储 {len(students)} 条记录。")
这里使用:
with open(...) as f:
好处是文件用完后会自动关闭。
可以在新增和删除后调用:
save()
比如:
students.append(student)
save()
删除后也一样:
students.remove(s)
save()
二十二、实现读档函数
程序启动时,需要从文件中把历史数据读回来。
import os
def load():
if not os.path.exists('d:/record.txt'):
return
students.clear()
with open('d:/record.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
tokens = line.split('\t')
if len(tokens) < 4:
print(f"文件格式有误: line={line}")
continue
student = {
'studentId': tokens[0],
'name': tokens[1],
'gender': tokens[2],
'className': tokens[3]
}
students.append(student)
print(f"[读档成功] 共读取 {len(students)} 条记录。")
这里用到了标准库 os:
os.path.exists('d:/record.txt')
判断存档文件是否存在。
然后在 main() 开头调用:
def main():
load()
print('+--------------------------+')
print('| 欢迎来到学生管理系统 |')
print('+--------------------------+')
while True:
...
这样程序每次启动时都会先读取历史数据。

二十三、打包成 exe 程序
Python 脚本默认需要在安装了 Python 环境的电脑上运行。
如果想把程序发给别人,并希望别人不安装 Python 也能运行,可以使用 PyInstaller 打包。
1. 安装 PyInstaller
python -m pip install pyinstaller
2. 打包程序
进入 .py 文件所在目录,然后执行:
pyinstaller -F 学生管理系统.py
其中:
-F
表示打包成单个可执行文件。
打包完成后,一般会生成几个目录:
build/
dist/
学生管理系统.spec
最终 exe 文件通常在:
dist/
目录下。
注意:原文里写成了 pyinstall -F,实际命令应为:
pyinstaller -F 文件名.py

二十四、使用库时的几个建议
1. 先判断标准库能不能解决
比如:
日期时间 datetime
文件路径 os / pathlib
随机数 random
JSON 数据 json
多线程 threading
退出程序 sys.exit
这些都不需要安装第三方库。
能用标准库解决的,就优先用标准库。
2. 第三方库优先看官方文档
搜索第三方库时,不要只复制网上的代码。
比较稳的流程是:
搜索需求
找到常用库
进入 PyPI 或官方文档
查看安装方式
查看最小示例
自己写一个 demo 验证
再放进项目
这比直接复制一大段代码可靠得多。
3. 注意版本问题
很多初学者遇到的问题不是代码写错,而是版本不对。
比如:
pip install xlrd
装到新版本后,可能无法读取 .xlsx。
所以有时候要指定版本:
pip install xlrd==1.2.0
或者改用更适合的库:
pip install openpyxl
4. 多个 Python 环境时要看解释器
如果你明明安装了库,但 PyCharm 还是提示找不到模块,通常要检查:
Settings -> Project -> Python Interpreter
看看当前项目使用的解释器是不是你刚才安装库的那个 Python。
命令行中也可以用:
python -m pip show 库名
查看库到底装到了哪里。
5. 不要为了用库而用库
库是工具,不是目的。
简单需求用几行代码就能解决,就不一定非要引入第三方库。
比如判断字符串前缀:
s.startswith(word)
已经足够好,就没必要再找库。
总结
Python 的库,是 Python 学习中非常关键的一部分。
语法决定你能不能写程序,库决定你能不能高效地写程序。
初学时可以按照这个顺序学习:
先掌握标准库
再学习 pip
再尝试第三方库
最后做综合小项目
标准库中,建议优先熟悉:
datetime
os
sys
json
random
pathlib
threading
第三方库中,可以根据方向逐步接触:
qrcode 生成二维码
openpyxl 操作 Excel
requests 网络请求
pandas 数据分析
matplotlib 数据可视化
pyinstaller 程序打包
不要试图一次性记住所有库。更现实的做法是:知道有哪些工具,知道它们大概能解决什么问题,需要时再查文档、写 demo、放进项目。
1849

被折叠的 条评论
为什么被折叠?



