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

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

头像

🔥 星恒随风: 个人主页
❄️ 个人专栏: 《指针合集》 《C语言基础》 《数据结构》 《机器学习导论》 《前端基础》 《python基础》 《C++从入门到入土》
✨ 数据即知识,压缩即智能

文章目录

前言

刚开始学 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

假设表格内容如下:

姓名班级分数
张三10068
李四10076
王五10074
赵六10189
田七10175
周八10090
刘九10157

需求:求 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、放进项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值