【Python基础】(五)Python 库使用全攻略:从标准库到第三方库,让开发效率翻倍

【Python基础】(五)Python 库使用全攻略:从标准库到第三方库,让开发效率翻倍

目录

​编辑

前言

一、Python 库的核心认知:什么是库?为什么要用库?

1.1 库的本质:现成的 "代码工具箱"

1.2 库的分类:标准库 vs 第三方库

(1)标准库:Python 自带的 "基础工具箱"

(2)第三方库:全球开发者共建的 "扩展工具箱"

1.3 使用库的核心优势:效率翻倍的关键

二、标准库实战:内置工具的高效用法

2.1 日期时间处理:datetime库(计算日期差、格式转换)

实战需求:计算你和心爱的人认识多少天

扩展用法:日期格式化与解析

2.2 字符串操作:内置字符串方法(解决 LeetCode 经典题)

实战 1:翻转单词顺序(LeetCode 剑指 Offer 58)

实战 2:旋转字符串(LeetCode 796)

实战 3:统计前缀字符串数目(LeetCode 2255)

        字符串方法总结:

2.3 文件查找工具:os库(递归遍历目录)

实战需求:根据关键词查找指定目录下的文件

运行示例:

核心函数解析:

2.4 数学计算:math库(三角函数、随机数、常量)

实战示例:数学运算常用功能

注意事项:

三、第三方库实战:解锁更多高级功能

3.1 第三方库使用流程:3 步搞定

步骤 1:找到合适的库

步骤 2:用 pip 安装库

(1)pip 基本命令

(2)常见问题解决

步骤 3:导入库并使用

3.2 实战 1:生成二维码(qrcode库)

步骤 1:安装qrcode库

步骤 2:生成基础二维码

步骤 3:自定义二维码样式(高级用法)

运行效果:

核心原理:

3.3 实战 2:操作 Excel 文件(xlrd库读取、xlwt库写入)

需求:计算 100 班学生的平均分

步骤 1:安装xlrd库

步骤 2:编写代码读取 Excel 并计算平均分

运行结果:

扩展:用xlwt库写入 Excel 文件

注意事项:

3.4 实战 3:程序猿鼓励师(pynput+playsound库)

步骤 1:安装依赖库

步骤 2:准备音频文件

步骤 3:编写基础版代码

步骤 4:优化版(多线程解决音频卡顿)

运行效果:

核心原理:

四、综合实战:开发命令行版学生管理系统

4.1 需求说明

4.2 技术选型

4.3 完整代码实现

4.4 代码解析

(1)核心数据结构

(2)存档与读档

(3)功能模块

(4)用户体验优化

4.5 打包成 exe 程序(pyinstaller库)

步骤 1:安装pyinstaller库

步骤 2:打包程序

命令参数说明:

步骤 3:找到 exe 文件

步骤 4:运行 exe 程序

常见问题:

五、Python 库学习资源推荐

5.1 书籍推荐

5.2 在线资源

5.3 学习技巧

总结


前言

        荀子曰:"君子性非异也,善假于物也"。对于 Python 开发者而言,"物" 便是那些千千万万的优秀库 —— 别人早已写好的代码,我们拿来就能用,无需重复 "造轮子"。Python 能成为如今最流行的编程语言之一,除了简洁易懂的语法,更离不开其生态完备的库体系。无论是日常数据处理、网络编程,还是复杂的可视化、人工智能开发,都有对应的库为我们保驾护航。

        这篇博客将从库的基础概念出发,详细拆解标准库与第三方库的使用方法,带你从入门到精通 Python 库的应用。全文干货满满,建议收藏慢慢研读!下面就让我们正式开始吧!

一、Python 库的核心认知:什么是库?为什么要用库?

1.1 库的本质:现成的 "代码工具箱"

        简单来说,Python 库就是一组预先编写好的代码集合,包含了函数、类、变量等,专门用于解决某一类特定问题。就像我们做饭时不需要自己种蔬菜、磨面粉,直接去超市买现成的食材就能快速烹饪 —— 使用库,就是直接调用别人已经验证过的优质代码,省去从零开发的时间和精力。

        比如我们要实现 "计算两个日期的间隔天数",如果自己手写代码,需要处理闰年、每个月的天数差异等复杂逻辑,稍有不慎就会出错;但如果使用 Python 内置的datetime库,几行代码就能搞定,既高效又可靠。

1.2 库的分类:标准库 vs 第三方库

        Python 的库主要分为两大类,二者各有侧重,共同构成了 Python 强大的生态系统:

(1)标准库:Python 自带的 "基础工具箱"

        标准库是 Python 安装包自带的库,无需额外安装,开箱即用。就像买手机时自带的基础功能(打电话、发短信),满足日常开发的核心需求。Python 的标准库非常丰富,覆盖了几乎所有基础开发场景,主要包括:

  • 内置函数与类型:如print()len()、字符串str、列表list等,无需导入可直接使用;
  • 文本处理:字符串拼接、分割、正则匹配等;
  • 时间日期:日期构造、时间差计算、格式转换等
  • 数学计算:三角函数、随机数生成、数值运算等;
  • 文件目录:文件读写、目录遍历、路径操作等;
  • 数据存储:数据库连接、JSON 序列化等;
  • 加密解密:MD5、SHA 等哈希算法;
  • 操作系统交互:进程管理、环境变量操作等;
  • 并发编程:多进程、多线程、协程等;
  • 网络编程:HTTP 请求、Socket 通信等;
  • 图形化界面:Tkinter 等基础 GUI 工具。

        我们不需要死记硬背标准库的所有功能,只需大概了解其覆盖范围,用到时查阅官方文档(Python 3.10 标准库文档)即可。

(2)第三方库:全球开发者共建的 "扩展工具箱"

        标准库虽强,但无法覆盖所有细分场景(比如生成二维码、操作 Excel、机器学习等)。这时就需要第三方库 —— 由全球 Python 开发者贡献的开源库,托管在PyPI(Python Package Index)上,相当于一个巨大的 "应用商店",你需要什么功能,几乎都能找到对应的库。

        第三方库的优势在于:

针对性强:专门解决某一细分问题,功能更专业(如pandas处理数据、requests发送网络请求);更新迭代快:由社区持续维护,不断修复 bug、增加新功能;开箱即用:经过大量用户验证,稳定性有保障。

        使用第三方库的核心流程是:确定需求→找到合适的库→用 pip 安装→导入使用,后面会详细拆解这个流程。

1.3 使用库的核心优势:效率翻倍的关键

        为什么高手写代码又快又好?核心原因之一就是善于用库。使用库的优势主要体现在:

节省开发时间:避免重复编写基础代码,把精力集中在核心业务逻辑上;提升代码质量:库的代码经过大量测试和优化,比自己手写的代码更稳定、效率更高;降低学习成本:无需深入掌握某一领域的底层原理,只需学会库的 API 调用即可实现功能;增强程序扩展性:库的功能往往很丰富,后续需要扩展功能时,可直接调用库的其他接口。

        比如要实现 "生成二维码",如果自己从零开发,需要掌握二维码的编码规则、图像生成等知识,难度极大;但使用qrcode库,只需 3 行代码就能生成二维码,门槛极低。

二、标准库实战:内置工具的高效用法

        标准库是 Python 的基本功,掌握常用标准库的用法,能解决日常开发中 80% 的问题。下面结合 4 个高频场景,带你实战标准库的核心用法。

2.1 日期时间处理:datetime库(计算日期差、格式转换)

        日常开发中,日期时间处理是高频需求(如计算两个日期的间隔、格式化日期字符串等),datetime库是处理这类问题的利器。

实战需求:计算你和心爱的人认识多少天

        比如你和 TA 在 2012 年 2 月 14 日相识,想知道到 2022 年 7 月 12 日一共认识了多少天,用datetime库只需 5 行代码:

# 导入datetime模块 import datetime # 构造两个日期对象(参数格式:年、月、日) date1 = datetime.datetime(2012, 2, 14) # 相识日期 date2 = datetime.datetime(2022, 7, 12) # 目标日期 # 两个日期对象直接相减,得到时间差 time_diff = date2 - date1 # 输出结果(days属性获取天数) print(f"相识天数:{time_diff.days} 天") 

        ·运行结果:

相识天数:3801 天 

扩展用法:日期格式化与解析

        除了计算日期差,datetime库还支持日期与字符串的相互转换,这在处理日志、数据库存储时非常有用:

import datetime # 1. 获取当前日期时间 now = datetime.datetime.now() print("当前日期时间(默认格式):", now) # 输出:2024-05-20 14:30:00.123456 # 2. 日期格式化为字符串(strftime方法) # 格式化规则:%Y(4位年)、%m(2位月)、%d(2位日)、%H(24小时)、%M(分钟)、%S(秒) now_str = now.strftime("%Y-%m-%d %H:%M:%S") print("格式化后:", now_str) # 输出:2024-05-20 14:30:00 # 3. 字符串解析为日期(strptime方法) date_str = "2024-01-01" date_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d") print("解析后的日期对象:", date_obj) # 输出:2024-01-01 00:00:00 

        官方文档:datetime 库详细用法

2.2 字符串操作:内置字符串方法(解决 LeetCode 经典题)

        字符串是 Python 的内置类型,其自带的方法(无需导入库)就能解决大部分字符串处理需求。下面结合 3 道 LeetCode 经典题,实战字符串方法的用法。

实战 1:翻转单词顺序(LeetCode 剑指 Offer 58)

        题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/description/

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。例如输入 "I am a student.",输出 "student. a am I"。

解题思路:使用split()分割字符串→reverse()反转列表→join()拼接字符串:

def reverse_words(s): # split()默认以空格分割,自动忽略首尾空格和多个连续空格 tokens = s.split() # 反转列表中的单词顺序 tokens.reverse() # 用空格拼接列表中的单词 return ' '.join(tokens) # 测试 print(reverse_words("I am a student. ")) # 输出:student. a am I print(reverse_words(" Hello world! ")) # 输出:world! Hello 

实战 2:旋转字符串(LeetCode 796)

        题目链接:https://leetcode.cn/problems/rotate-string/description/

题目:给定两个字符串sgoal,如果在若干次旋转操作后s能变成goal,返回True。旋转操作是将s最左边的字符移动到最右边(如s="abcde",旋转一次为"bcdea")。

解题思路:如果s旋转后能得到goal,则goal一定是s+s的子串(如s="abcde"s+s="abcdeabcde",旋转后的"cdeab"是其子串):

def rotate_string(s, goal): # 首先判断长度是否一致,不一致直接返回False return len(s) == len(goal) and goal in s + s # 测试 print(rotate_string("abcde", "cdeab")) # 输出:True print(rotate_string("abcde", "abced")) # 输出:False 

实战 3:统计前缀字符串数目(LeetCode 2255)

        题目链接:https://leetcode.cn/problems/count-prefixes-of-a-given-string/description/

题目:给定字符串数组words和字符串s,返回words中是s前缀的字符串数目(前缀是出现在字符串开头的连续子串)。

解题思路:遍历words,使用startswith()方法判断是否为s的前缀:

def count_prefixes(words, s): count = 0 for word in words: # startswith()判断word是否是s的前缀 if s.startswith(word): count += 1 return count # 测试 words = ["a", "b", "c", "ab", "bc", "abc"] s = "abc" print(count_prefixes(words, s)) # 输出:3("a"、"ab"、"abc"都是前缀) 
        字符串方法总结:
分割split(sep)—— 按指定分隔符分割字符串;拼接join(iterable)—— 用字符串拼接可迭代对象;前缀 / 后缀判断startswith(prefix)endswith(suffix)替换replace(old, new)—— 替换字符串中的指定子串;去除空格strip()—— 去除首尾空格,lstrip()/rstrip()去除左 / 右空格。

        官方文档:字符串方法详细列表

2.3 文件查找工具:os库(递归遍历目录)

    os库是 Python 与操作系统交互的核心库,其中os.walk()方法能递归遍历指定目录下的所有文件和子目录,非常适合实现 "文件查找" 功能。

实战需求:根据关键词查找指定目录下的文件

        比如你想在D:/project目录下查找所有文件名包含 "report" 的文件,用os.walk()就能实现:

import os def search_files_by_keyword(): # 输入待搜索路径和关键词 input_path = input("请输入待搜索路径(如D:/project):") keyword = input("请输入待搜索关键词(如report):") # 验证路径是否存在 if not os.path.exists(input_path): print("路径不存在,请检查输入!") return # os.walk()递归遍历目录:返回(当前路径, 子目录列表, 文件列表) for dirpath, dirnames, filenames in os.walk(input_path): # 遍历当前目录下的所有文件 for filename in filenames: # 判断文件名是否包含关键词 if keyword in filename: # 拼接完整路径并输出 full_path = os.path.join(dirpath, filename) print(f"找到文件:{full_path}") # 执行查找 search_files_by_keyword() 
运行示例:
请输入待搜索路径(如D:/project):D:/test 请输入待搜索关键词(如report):data 找到文件:D:/test/2024_data.csv 找到文件:D:/test/backup/data_202405.txt 找到文件:D:/test/docs/data_analysis.docx 
核心函数解析:
os.path.exists(path):判断路径是否存在;os.walk(path):递归遍历路径,返回三元组(当前路径、子目录列表、文件列表);os.path.join(dirpath, filename):拼接目录和文件名,生成完整路径(避免手动拼接路径分隔符出错)。

官方文档:os 库详细用法

2.4 数学计算:math库(三角函数、随机数、常量)

    math库提供了丰富的数学运算功能,涵盖三角函数、对数函数、随机数生成、常量定义等,满足科学计算的基本需求。

实战示例:数学运算常用功能

import math import random # 随机数模块(属于标准库) # 1. 常量 print("圆周率π:", math.pi) # 输出:3.141592653589793 print("自然常数e:", math.e) # 输出:2.718281828459045 # 2. 三角函数(弧度制) print("sin(π/2):", math.sin(math.pi/2)) # 输出:1.0 print("cos(π):", math.cos(math.pi)) # 输出:-1.0 print("tan(π/4):", math.tan(math.pi/4)) # 输出:1.0 # 3. 对数与指数 print("ln(10):", math.log(10)) # 自然对数,输出:2.302585093 print("log10(100):", math.log10(100)) # 以10为底,输出:2.0 print("e^2:", math.exp(2)) # 指数运算,输出:7.38905609893 # 4. 数值运算 print("绝对值:", math.fabs(-10.5)) # 输出:10.5 print("向上取整:", math.ceil(3.2)) # 输出:4 print("向下取整:", math.floor(3.8)) # 输出:3 print("四舍五入:", round(3.456, 2)) # 输出:3.46(round是内置函数) print("阶乘:", math.factorial(5)) # 输出:120(5×4×3×2×1) # 5. 随机数生成 print("0-1之间的随机浮点数:", random.random()) # 输出:0.345678... print("1-10之间的随机整数:", random.randint(1, 10)) # 输出:5(示例) print("从列表中随机选择一个元素:", random.choice(["a", "b", "c"])) # 输出:b(示例) 
注意事项:
math库的三角函数默认使用弧度制,如果需要用角度制,需先通过math.radians(angle)将角度转换为弧度;随机数模块是random(独立于math库),常用于模拟、抽样等场景。

三、第三方库实战:解锁更多高级功能

        如果说标准库是 "基础工具箱",第三方库就是 "专业工具箱"。下面带你掌握第三方库的核心使用流程(找库→安装→使用),并结合 3 个高频实战案例,让你快速上手。

3.1 第三方库使用流程:3 步搞定

步骤 1:找到合适的库

        当遇到标准库无法解决的需求时,如何找到对应的第三方库?推荐 3 个方法:

社区推荐:GitHub、ZEEKLOG、知乎等平台,看其他开发者的实战分享。

PyPI 官网https://pypi.org/,Python 官方第三方库仓库,可搜索库名查看详情;

搜索引擎:直接百度 / Bing 搜索 "Python + 需求"(如 "Python 生成二维码"),通常会找到相关库推荐;

步骤 2:用 pip 安装库

        pip 是 Python 内置的包管理器(类似手机的应用商店),用于安装、卸载、管理第三方库。安装 Python 时,pip 会自动附带(需勾选 "Add Python 3.10 to PATH")。

(1)pip 基本命令
安装库pip install 库名(如pip install qrcode);安装指定版本pip install 库名==版本号(如pip install xlrd==1.2.0);卸载库pip uninstall 库名查看已安装的库pip list升级 pippip install --upgrade pip(解决 pip 版本过低的警告)。
(2)常见问题解决
问题 1:命令行输入pip提示 "不是内部或外部命令"?解决:Python 安装时未勾选 "Add Python to PATH",需手动将 Python 安装目录下的Scripts文件夹添加到系统环境变量,或卸载重装 Python(记得勾选该选项)。问题 3:PyCharm 中安装库后仍提示 "找不到模块"?解决:检查 PyCharm 的 Python 解释器配置 —— 打开Settings → Project → Python Interpreter,确保选择的解释器是安装库时使用的 Python 版本(如果电脑安装了多个 Python 版本,容易出现此问题)。

问题 2:安装库时速度慢、超时?解决:使用国内镜像源(如阿里云、清华源),命令格式:pip install 库名 -i 镜像源地址,示例:

# 阿里云镜像 pip install qrcode -i https://mirrors.aliyun.com/pypi/simple/ # 清华源 pip install qrcode -i https://pypi.tuna.tsinghua.edu.cn/simple/ 

        若能正常使用pip,则在命令行输入pip,会输出以下内容:

步骤 3:导入库并使用

        安装完成后,通过import 库名导入,即可调用库的功能。下面结合 3 个实战案例,带你实操。

3.2 实战 1:生成二维码(qrcode库)

        二维码广泛用于网址跳转、信息存储等场景,qrcode库是 Python 生成二维码的常用工具,简单易用。

步骤 1:安装qrcode

    qrcode库依赖图像处理库PIL,安装时需一并安装:

pip install qrcode[pil] 

步骤 2:生成基础二维码

        生成包含文本、网址的二维码,保存为图片文件:

import qrcode # 1. 生成文本二维码 img1 = qrcode.make("Hello Python!这是我的第一个二维码") # 保存图片(支持png、jpg等格式) img1.save("text_qrcode.png") print("文本二维码生成成功!") # 2. 生成网址二维码(扫码自动跳转) img2 = qrcode.make("https://blog.ZEEKLOG.net/") img2.save("url_qrcode.png") print("网址二维码生成成功!") 

步骤 3:自定义二维码样式(高级用法)

        可自定义二维码的大小、边框、颜色等参数:

import qrcode # 创建二维码配置对象 qr = qrcode.QRCode( version=1, # 二维码大小(1-40,越大越复杂) error_correction=qrcode.constants.ERROR_CORRECT_L, # 纠错级别(L/M/Q/H,纠错能力递增) box_size=10, # 每个格子的像素大小 border=4, # 边框宽度(默认4) ) # 添加二维码内容 qr.add_data("https://github.com/") qr.make(fit=True) # 自动适配大小 # 自定义颜色(前景色、背景色) img = qr.make_image(fill_color="blue", back_color="white") img.save("custom_qrcode.png") print("自定义二维码生成成功!") 
运行效果:

        生成的text_qrcode.pngurl_qrcode.png等文件,用微信、支付宝扫码即可查看内容(网址二维码会自动跳转)。

核心原理:

        二维码的本质是用黑白点阵表示字符串,扫码工具(如微信)会解析点阵信息,还原为原始字符串(如果是网址,则自动跳转)。

3.3 实战 2:操作 Excel 文件(xlrd库读取、xlwt库写入)

        Excel 是日常工作中常用的数据存储格式,xlrd库用于读取 Excel 文件,xlwt库用于写入 Excel 文件,二者配合可实现 Excel 数据的自动化处理。

需求:计算 100 班学生的平均分

        假设有 Excel 文件d:/test.xlsx,数据如下:

        需计算 100 班学生的平均分。

步骤 1:安装xlrd

        注意:xlrd最新版本(2.0+)已删除对xlsx格式的支持,需安装 1.2.0 版本:

pip install xlrd==1.2.0 

步骤 2:编写代码读取 Excel 并计算平均分

import xlrd def calculate_class_average(): # 1. 打开Excel文件(支持xlsx、xls格式) excel_file = xlrd.open_workbook("d:/test.xlsx") # 2. 获取工作表(通过索引,0表示第一个工作表) sheet = excel_file.sheet_by_index(0) # 3. 获取总行数(sheet.nrows)和总列数(sheet.ncols) total_rows = sheet.nrows print(f"Excel文件共有 {total_rows} 行数据") # 4. 遍历数据,计算101班的总分和人数 class_id_target = 101 # 目标班级 total_score = 0 # 总分 student_count = 0 # 人数 # 从第2行开始遍历(第1行是表头) for row in range(1, total_rows): # 获取班级(第2列,索引为1)和分数(第3列,索引为2) class_id = sheet.cell_value(row, 1) score = sheet.cell_value(row, 2) # 判断是否为目标班级,且分数为数字 if class_id == class_id_target and isinstance(score, float): total_score += score student_count += 1 # 5. 计算平均分 if student_count > 0: average_score = total_score / student_count print(f"{class_id_target}班共有 {student_count} 名学生,平均分为:{average_score:.2f}") else: print(f"未找到 {class_id_target} 班的学生数据!") # 执行计算 calculate_class_average() 
运行结果:
Excel文件共有 8 行数据 101班共有 3 名学生,平均分为:73.67 

扩展:用xlwt库写入 Excel 文件

        如果需要将计算结果写入新的 Excel 文件,可使用xlwt库:

import xlwt def write_to_excel(): # 1. 创建工作簿 workbook = xlwt.Workbook(encoding="utf-8") # 2. 创建工作表(命名为"101班平均分") sheet = workbook.add_sheet("101班平均分") # 3. 写入表头 sheet.write(0, 0, "班级") sheet.write(0, 1, "学生人数") sheet.write(0, 2, "平均分") # 4. 写入数据(假设已计算出结果) sheet.write(1, 0, 101) sheet.write(1, 1, 3) sheet.write(1, 2, 73.67) # 5. 保存文件 workbook.save("d:/101班成绩统计.xls") print("Excel文件写入成功!") # 执行写入 write_to_excel() 
注意事项:
xlwt库生成的是.xls格式文件(不支持.xlsx),如果需要生成.xlsx格式,可使用openpyxl库;读取 Excel 时,单元格索引从 0 开始(第 1 列索引为 0,第 1 行索引为 0)。

3.4 实战 3:程序猿鼓励师(pynput+playsound库)

        长时间编程容易疲劳,我们可以做一个 "程序猿鼓励师":每按键盘 20 次,自动播放一段鼓励音频(如 "加油,你真棒!"),缓解编程压力。

步骤 1:安装依赖库

pynput:监听键盘按键;playsound:播放音频文件。

        注意版本兼容问题,推荐安装指定版本:

pip install pynput==1.6.8 pip install playsound==1.2.2 

步骤 2:准备音频文件

        在 Python 代码同级目录下,准备一个音频文件(如ding.mp3,可自行录制鼓励语音或下载音效)。

步骤 3:编写基础版代码

from pynput import keyboard from playsound import playsound # 按键计数 key_count = 0 def on_key_release(key): """按键释放时触发的回调函数""" global key_count key_count += 1 print(f"已按键 {key_count} 次") # 每按键10次,播放鼓励音频 if key_count % 10 == 0: playsound("ding.mp3") print("加油,你真棒!继续努力!") # 创建键盘监听器 listener = keyboard.Listener(on_release=on_key_release) # 启动监听器 listener.start() # 让程序持续运行(等待用户按键) listener.join() 

步骤 4:优化版(多线程解决音频卡顿)

        基础版代码在播放音频时会导致键盘监听卡顿(因为playsound是阻塞式的),可使用多线程解决:

from pynput import keyboard from playsound import playsound from threading import Thread # 多线程库(标准库) key_count = 0 def play_encouragement(): """播放鼓励音频(单独线程执行)""" playsound("ding.mp3") print("加油,你真棒!继续努力!") def on_key_release(key): global key_count key_count += 1 print(f"已按键 {key_count} 次") if key_count % 10 == 0: # 创建线程播放音频(非阻塞) thread = Thread(target=play_encouragement) thread.start() # 启动监听器 listener = keyboard.Listener(on_release=on_key_release) listener.start() listener.join() 
运行效果:

        运行程序后,每按 10 次键盘,就会自动播放ding.mp3音频并打印鼓励语,且不会影响键盘输入(解决了卡顿问题)。

核心原理:
pynput.keyboard.Listener监听键盘事件,on_release参数指定按键释放时的回调函数;多线程(Thread让音频播放在后台执行,避免阻塞主线程的键盘监听。

四、综合实战:开发命令行版学生管理系统

        前面我们学习了标准库和第三方库的基础用法,现在结合这些知识,开发一个实用的命令行版学生管理系统,实现学生信息的增删查改、存档读档功能,并最终打包成 exe 程序。

4.1 需求说明

        系统功能:

新增学生(学号、姓名、性别、班级);显示所有学生信息;根据姓名查找学生;根据学号删除学生;自动存档(新增 / 删除后保存到文件);启动时自动读档(加载历史数据);支持打包成 exe,无需 Python 环境运行。

4.2 技术选型

标准库os(文件操作)、sys(程序退出)、threading(可选,用于优化体验);无第三方库依赖(保证打包后体积小、兼容性好)。

4.3 完整代码实现

import os import sys # 全局变量:存储所有学生信息(列表+字典) students = [] def load_data(): """读档函数:启动时加载历史数据(从d:/record.txt读取)""" global students # 清空现有数据 students = [] # 定义存档文件路径 data_file = "d:/record.txt" # 如果文件不存在,直接返回(首次使用无存档) if not os.path.exists(data_file): print("未找到存档文件,将创建新数据!") return # 读取文件并解析数据 try: with open(data_file, "r", encoding="utf-8") as f: for line_num, line in enumerate(f, start=1): # 去除换行符和首尾空格 line = line.strip() # 跳过空行 if not line: continue # 按制表符分割数据(格式:学号\t姓名\t性别\t班级) parts = line.split("\t") # 验证数据格式(必须包含4个字段) if len(parts) != 4: print(f"存档文件第{line_num}行格式错误,跳过该条数据:{line}") continue # 构造学生字典 student = { "student_id": parts[0], "name": parts[1], "gender": parts[2], "class_name": parts[3] } # 添加到学生列表 students.append(student) print(f"读档成功!共加载 {len(students)} 条学生数据") except Exception as e: print(f"读档失败:{str(e)}") def save_data(): """存档函数:新增/删除学生后保存数据到d:/record.txt""" data_file = "d:/record.txt" try: with open(data_file, "w", encoding="utf-8") as f: for student in students: # 按格式写入:学号\t姓名\t性别\t班级\n line = f"{student['student_id']}\t{student['name']}\t{student['gender']}\t{student['class_name']}\n" f.write(line) print(f"存档成功!共保存 {len(students)} 条学生数据") except Exception as e: print(f"存档失败:{str(e)}") def show_menu(): """显示系统菜单""" print("=" * 40) print(" Python 学生管理系统 v1.0") print("=" * 40) print(" 1. 新增学生信息") print(" 2. 显示所有学生信息") print(" 3. 根据姓名查找学生") print(" 4. 根据学号删除学生") print(" 0. 退出系统") print("=" * 40) # 获取用户输入并转换为整数 while True: choice = input("请输入您的选择(0-4):") if choice.isdigit(): choice = int(choice) if 0 <= choice <= 4: return choice else: print("输入错误!请输入0-4之间的数字") else: print("输入错误!请输入有效的数字") def add_student(): """新增学生信息""" print("\n【新增学生】") # 输入学生信息 student_id = input("请输入学号(如2024001):").strip() name = input("请输入姓名:").strip() gender = input("请输入性别(男/女):").strip() class_name = input("请输入班级(如101):").strip() # 数据验证 if not student_id or not name or not gender or not class_name: print("新增失败:所有字段不能为空!") return if gender not in ("男", "女"): print("新增失败:性别必须是'男'或'女'!") return # 验证学号唯一性(避免重复) for student in students: if student["student_id"] == student_id: print("新增失败:该学号已存在!") return # 构造学生字典并添加到列表 new_student = { "student_id": student_id, "name": name, "gender": gender, "class_name": class_name } students.append(new_student) print(f"新增成功!{name}(学号:{student_id})已添加到系统") # 自动存档 save_data() def show_all_students(): """显示所有学生信息""" print("\n📋 【显示所有学生】") if not students: print("系统中暂无学生数据!") return # 打印表头 print(f"{'学号':<10} {'姓名':<6} {'性别':<4} {'班级':<6}") print("-" * 30) # 遍历打印学生信息 for student in students: print(f"{student['student_id']:<10} {student['name']:<6} {student['gender']:<4} {student['class_name']:<6}") print("-" * 30) print(f"共显示 {len(students)} 条学生数据\n") def search_student_by_name(): """根据姓名查找学生""" print("\n查找学生】") if not students: print("系统中暂无学生数据!") return search_name = input("请输入要查找的学生姓名:").strip() if not search_name: print("查找失败:姓名不能为空!") return # 查找匹配的学生(支持模糊查询,如输入"张"匹配"张三") result = [] for student in students: if search_name in student["name"]: result.append(student) # 显示查找结果 if not result: print(f"未找到姓名包含'{search_name}'的学生!") return print(f"共找到 {len(result)} 条匹配数据:") print(f"{'学号':<10} {'姓名':<6} {'性别':<4} {'班级':<6}") print("-" * 30) for student in result: print(f"{student['student_id']:<10} {student['name']:<6} {student['gender']:<4} {student['class_name']:<6}") print() def delete_student_by_id(): """根据学号删除学生""" print("\n🗑️ 【删除学生】") if not students: print("系统中暂无学生数据!") return delete_id = input("请输入要删除的学生学号:").strip() if not delete_id: print("删除失败:学号不能为空!") return # 查找要删除的学生 deleted_count = 0 for i in range(len(students)-1, -1, -1): # 倒序遍历,避免删除后索引错乱 if students[i]["student_id"] == delete_id: deleted_student = students.pop(i) print(f"删除成功!已删除学生:{deleted_student['name']}(学号:{delete_id})") deleted_count += 1 if deleted_count == 0: print(f"删除失败:未找到学号为'{delete_id}'的学生!") return # 自动存档 save_data() def main(): """程序入口函数""" # 启动时自动读档 load_data() print("\n欢迎使用Python学生管理系统!") # 主循环:持续接收用户操作 while True: choice = show_menu() if choice == 0: # 退出系统 print("\n感谢使用,再见!") sys.exit() elif choice == 1: add_student() elif choice == 2: show_all_students() elif choice == 3: search_student_by_name() elif choice == 4: delete_student_by_id() # 每次操作后暂停,让用户看清结果 input("\n按回车键继续...") # 程序启动入口 if __name__ == "__main__": main() 

4.4 代码解析

(1)核心数据结构

        用全局列表students存储所有学生信息,每个学生是一个字典,结构如下:

{ "student_id": "2024001", # 学号 "name": "张三", # 姓名 "gender": "男", # 性别 "class_name": "101" # 班级 } 

(2)存档与读档

存档文件d:/record.txt,采用文本格式存储,每行一条学生数据,字段用制表符\t分隔;读档load_data()):程序启动时读取文件,解析数据并加载到students列表;存档save_data()):新增 / 删除学生后,将students列表的数据写入文件,确保数据持久化。

(3)功能模块

菜单显示show_menu()):清晰展示功能选项,支持输入验证;新增学生add_student()):输入验证(字段非空、性别合法、学号唯一);显示所有show_all_students()):格式化输出,美观易读;查找学生search_student_by_name()):支持模糊查询(如输入 "张" 匹配 "张三");删除学生delete_student_by_id()):按学号删除,避免误删。

(4)用户体验优化

输入验证:避免无效输入导致程序崩溃;操作反馈:每个操作后打印成功 / 失败提示;自动存档:无需手动保存,数据不丢失;读档容错:存档文件格式错误时跳过异常数据,不影响整体运行。

4.5 打包成 exe 程序(pyinstaller库)

        当前代码是.py文件,需要在安装了 Python 环境的电脑上运行。为了让程序在任何 Windows 电脑上运行,我们可以用pyinstaller库将其打包成 exe 文件。

步骤 1:安装pyinstaller

pip install pyinstaller 

步骤 2:打包程序

打开命令行,切换到学生管理系统代码所在的目录(如cd D:/python_project);执行打包命令:
pyinstaller -F -w 学生管理系统.py 
命令参数说明:
-F:打包成单个 exe 文件(方便传输,不带其他依赖文件);-w:隐藏命令行窗口(运行 exe 时不会弹出黑框,更美观);最后是 Python 脚本文件名(如学生管理系统.py)。

步骤 3:找到 exe 文件

        打包完成后,会在代码目录下生成dist文件夹,exe 文件就在其中(文件名与脚本名一致,如学生管理系统.exe)。

步骤 4:运行 exe 程序

        双击学生管理系统.exe,即可直接运行(无需 Python 环境),功能与.py 文件完全一致,存档文件仍保存在d:/record.txt

常见问题:
打包后 exe 文件太大?可以使用虚拟环境(venv只安装必要的库,再进行打包;运行 exe 时提示 "找不到存档文件"?正常现象,首次运行会自动创建存档文件;中文乱码?打包时确保代码文件编码为 UTF-8,且运行环境支持中文。

五、Python 库学习资源推荐

        掌握了库的基本使用方法后,想要进一步提升,可以参考以下优质资源:

5.1 书籍推荐

《Python 编程:从入门到实践》:适合初学者,包含大量实战案例,涉及pygame(游戏开发)、Django(Web 开发)等第三方库;《流畅的 Python》:深入 Python 底层原理,讲解如何高效使用 Python 库和语言特性。

《Python Cookbook》(第 3 版):Python 进阶经典书籍,针对各种典型场景提供高效解决方案,覆盖标准库和第三方库的高级用法;

5.2 在线资源

PyPI 官网https://pypi.org/,查找第三方库的权威渠道,包含库的安装说明、文档链接、版本历史;Awesome Pythonhttps://gitee.com/awesome-lib/awesome-python,整理了 Python 优质第三方库,按功能分类(如 Web 开发、数据科学、机器学习等);500 Lines or Lesshttps://github.com/aosabook/500lines,用不超过 500 行 Python 代码实现有趣的程序(如 Web 服务器、搜索引擎),适合学习库的综合应用;Python 官方文档https://docs.python.org/3/,标准库的权威指南,详细介绍每个模块的 API 和用法。

5.3 学习技巧

按需学习:不需要掌握所有库,遇到具体需求时再针对性学习对应的库;多看源码:优秀的库(如requests)源码简洁易懂,阅读源码能学习到优雅的编程思路;多做实战:将库的用法融入实际项目(如爬虫、数据分析、小工具),才能真正掌握;关注社区:GitHub、Stack Overflow、ZEEKLOG 等平台,及时了解库的更新动态和常见问题解决方案。

总结

        Python 库是提升开发效率的神器,标准库满足基础需求,第三方库拓展高级功能。本文从库的核心概念出发,详细讲解了标准库(datetimeosmath)和第三方库(qrcodexlrdpynput)的使用方法,通过 5 个实战案例和 1 个综合项目,带你从入门到精通。

        最后,记住荀子的 "善假于物"—— 作为开发者,不必纠结于重复造轮子,而是要善于利用现有的优质库,将精力集中在核心业务逻辑上,才能高效地开发出高质量的程序。

        如果你有常用的 Python 库想要分享,或者在使用库的过程中遇到了问题,欢迎在评论区留言交流!祝大家编程之路越走越顺,效率翻倍!

Read more

深入解析C/C++标量初始化警告:braces around scalar initializer的根源与修复

1. 什么是"braces around scalar initializer"警告? 当你用C或C++写代码时,可能会遇到这样的警告:"warning: braces around scalar initializer"。这个警告的意思是你在初始化一个标量(scalar)变量时,不必要地使用了花括号{}。 标量变量指的是那些简单的、不可再分的变量类型,比如: * 基本数据类型:int, float, double等 * 指针类型:int*, char*等 * 枚举类型 举个例子,下面这行代码就会触发这个警告: int x = {5}; // 警告:标量初始化使用了不必要的花括号 而正确的写法应该是: int x = 5; // 正确:直接使用值初始化标量 这个警告通常出现在GCC和Clang编译器中,特别是当你开启了-Wall或-Wextra警告选项时。

By Ne0inhk

C++中std::string的弱点:你可能未曾注意到的缺点

性能方面的局限 由于std::string是动态大小的字符串,它需要在运行时动态分配内存来存储字符串的内容。在字符串长度变化时,要频繁地进行内存分配和释放操作,导致一定的性能开销。 1. 频繁的内存分配和释放操作可能导致内存碎片的产生,内存空间的利用率降低。 2. 内存分配的成本比较高,特别是在频繁进行小块内存分配时,会增加系统开销。 3. 频繁地进行内存分配和释放操作会导致性能下降,尤其是在大规模数据处理时。 当字符串长度超过当前分配的内存空间时,std::string需要进行动态内存重分配,这会带来一定的性能开销。当字符串长度超过当前分配的内存空间时,std::string需要进行内存重分配,涉及到申请新的内存空间、拷贝数据、释放旧内存等操作,导致性能开销。 std::string 的性能局限之一是字符串拼接的效率问题。当对多个字符串进行拼接操作时,使用加法操作符或者append()方法在每次拼接时都需要进行内存重新分配和复制,这会导致较高的性能开销。特别是在频繁拼接大量字符串时,这种操作会导致大量的内存重分配和数据复制,从而影响程序的性能表现。 三、可变性带来的

By Ne0inhk

JavaQuestPlayer终极指南:简单快速的QSP游戏完整解决方案

JavaQuestPlayer终极指南:简单快速的QSP游戏完整解决方案 【免费下载链接】JavaQuestPlayer 项目地址: https://gitcode.com/gh_mirrors/ja/JavaQuestPlayer 想要轻松畅玩各类QSP游戏却苦于复杂的配置过程?JavaQuestPlayer为你提供了最简单快捷的解决方案,这款基于Java开发的智能游戏运行器让新手也能快速上手,享受流畅的游戏体验。无论你是游戏爱好者还是开发者,都能在这里找到适合你的运行方式。 🎯 从零开始:快速入门指南 环境准备与项目获取 首先确保你的系统已安装Java运行环境,支持Oracle JDK1.8或OpenJDK JDK 11及以上版本。通过以下命令获取项目: git clone https://gitcode.com/gh_mirrors/ja/JavaQuestPlayer 项目结构清晰,主要源码位于src/main/java/com/baijiacms/qsp目录下,包含游戏控制器、资源管理、核心逻辑等模块。 两种运行模式详解 桌面应用模式提供原生的游戏体验

By Ne0inhk
计算机毕设java共享单车租借网络平台设计 基于SpringBoot的城市公共自行车智能租赁与调度系统 Java Web共享出行工具在线预约与运营管理平台

计算机毕设java共享单车租借网络平台设计 基于SpringBoot的城市公共自行车智能租赁与调度系统 Java Web共享出行工具在线预约与运营管理平台

计算机毕设java共享单车租借网络平台设计g4j999(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着城市化进程的加速和绿色出行理念的普及,共享单车作为解决"最后一公里"出行的重要方式,已成为现代城市交通体系的重要组成部分。然而,传统的单车租赁管理存在车辆分布不均、租借流程繁琐、费用结算不透明、车辆维护滞后等问题,难以满足用户便捷出行和运营商高效管理的需求。在智慧城市建设和共享经济发展的背景下,构建一套智能化、网络化的单车租借平台,能够实现车辆的精准调度、租借流程的自动化处理以及运营数据的实时分析,从而提升用户体验,优化资源配置,推动城市绿色交通的可持续发展。 本系统采用Java作为开发语言,基于SpringBoot框架构建,结合MySQL数据库和B/S架构设计,旨在打造一个功能完善、操作便捷、高效稳定的共享单车租借网络平台。系统核心功能模块涵盖以下方面: 用户管理模块:实现用户账号注册、登录、个人信息维护,包含用户账号、密码、用户姓名、头像、性别、手机号码、身份证号等基础信息管理,支持密码修改与账户

By Ne0inhk