查看: 255|回复: 0

Python标准库与第三方库实战:二维码Excel键盘监听

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
Python 的库通常分为标准库和第三方库:标准库随 Python 安装,import 后即可使用;第三方库需要额外用 pip 安装。本文按标准库常用模块、第三方库安装与实战、命令行学生管理系统、pyinstaller 打包的顺序,整理 datetime、os、qrcode、xlrd、pynput、playsound 等库的落地用法。

一、标准库常用模块
1. 日期计算
datetime 可以直接做日期减法,结果为 timedelta。
  1. import datetime
  2. date1 = datetime.datetime(2012, 2, 14)
  3. date2 = datetime.datetime(2022, 7, 12)
  4. print(date2 - date1)
复制代码
输出为 3801 days, 0:00:00。这个例子可用于计算两个日期相差多少天。

2. 字符串操作
字符串是内置类型,很多方法不用导入模块。
翻转单词顺序:
  1. def reverse_words(s):
  2.     tokens = s.split()
  3.     tokens.reverse()
  4.     return ' '.join(tokens)
  5. print(reverse_words('I am a student.'))
复制代码
输入 I am a student.,输出 student. a am I。思路是按空白切分成单词,反转列表后再用空格拼接。
判断旋转字符串:
  1. def rotate_string(s, goal):
  2.     return len(s) == len(goal) and goal in s + s
  3. print(rotate_string('abcde', 'cdeab'))
复制代码
如果 goal 是 s 旋转若干次后的结果,那么 goal 一定存在于 s+s 中,同时长度必须相等。
统计是给定字符串前缀的字符串数目:
  1. def count_prefixes(words, s):
  2.     res = 0
  3.     for word in words:
  4.         if s.startswith(word):
  5.             res += 1
  6.     return res
  7. print(count_prefixes(['a', 'b', 'c', 'ab', 'bc', 'abc'], 'abc'))
复制代码
这里用 s.startswith(word) 判断前缀,符合条件的字符串会累加计数。

3. 文件查找工具
指定搜索路径和关键词,查找文件名中包含关键词的文件。
  1. import os
  2. input_path = input('请输入待搜索路径:')
  3. pattern = input('请输入待搜索关键词:')
  4. for dirpath, dirnames, filenames in os.walk(input_path):
  5.     for f in filenames:
  6.         if pattern in f:
  7.             print(f'{dirpath}/{f}')
复制代码
os.walk 返回三元组:当前路径、目录名列表、文件名列表。遍历 filenames 即可对文件名做包含判断。

二、第三方库安装与实战
遇到需求时,先搜索适合的库,再用 pip 安装。pip 是 Python 内置包管理器,PyPI 用于收集第三方库。常用命令:
  1. pip install 库名
复制代码
如果提示 'pip' 不是内部或外部命令,说明 pip 没有加入 PATH,需要配置 PATH,或在重装 Python 时勾选 Add Python to PATH。安装后如果 PyCharm 仍找不到模块,检查 Settings -> Project -> Python Interpreter 是否选对解释器。

1. 生成二维码
安装 qrcode:
  1. pip install qrcode[pil]
复制代码
代码:
  1. import qrcode
  2. img = qrcode.make('我真帅')
  3. img.save('qrcode.png')
复制代码
运行后生成 qrcode.png,扫码即可看到内容。二维码本质是用黑白点阵表示字符串。

2. 用 xlrd 操作 Excel
读取 Excel 使用 xlrd,修改使用 xlwt。以 xlrd 为例,安装时要指定版本,因为最新版删除了 xlsx 支持:
  1. pip install xlrd==1.2.0
复制代码
假设有 d:/test.xlsx,求 101 班平均分:
  1. import xlrd
  2. xlsx = xlrd.open_workbook('d:/test.xlsx')
  3. table = xlsx.sheet_by_index(0)
  4. nrows = table.nrows
  5. count = 0
  6. total = 0
  7. for i in range(1, nrows):
  8.     class_id = table.cell_value(i, 1)
  9.     if class_id == 101:
  10.         total += table.cell_value(i, 2)
  11.         count += 1
  12. print(f'平均分:{total / count}')
复制代码
代码打开第一张工作表,nrows 取总行数,从第 1 行开始跳过表头;第 1 列是班级,第 2 列是分数。

3. 监听键盘按键,自动播放音频
需求:每按键 10 次,播放一个音频。安装指定版本:
  1. pip install pynput==1.6.8
  2. pip install playsound==1.2.2
复制代码
准备 ding.mp3 放在同级目录。基础实现:
  1. from pynput import keyboard
  2. from playsound import playsound
  3. count = 0
  4. def on_release(key):
  5.     global count
  6.     print(key)
  7.     count += 1
  8.     if count % 10 == 0:
  9.         playsound('ding.mp3')
  10. listener = keyboard.Listener(on_release=on_release)
  11. listener.start()
  12. listener.join()
复制代码
播放音频会导致按键卡顿。可以用多线程改进:
  1. from pynput import keyboard
  2. from playsound import playsound
  3. from threading import Thread
  4. count = 0
  5. def on_release(key):
  6.     global count
  7.     print(key)
  8.     count += 1
  9.     if count % 10 == 0:
  10.         t = Thread(target=playsound, args=('ding.mp3',))
  11.         t.start()
  12. listener = keyboard.Listener(on_release=on_release)
  13. listener.start()
  14. listener.join()
复制代码
把播放动作放到子线程,监听回调不再等待音频播放结束。

三、综合案例:命令行学生管理系统
功能包括新增学生、显示学生、查找学生、删除学生、存档到文件。核心数据结构是 students 列表,每个学生用字典保存 studentId、name、gender、className。

1. 入口函数
  1. import sys
  2. import os
  3. students = []
  4. def menu():
  5.     print('1. 新增学生信息')
  6.     print('2. 显示所有同学信息')
  7.     print('3. 根据名字查找学生信息')
  8.     print('4. 删除学生信息')
  9.     print('0. 退出程序')
  10.     choice = input('请输入您的选择:')
  11.     return int(choice)
  12. def main():
  13.     print('+----------------------------+')
  14.     print('| 欢迎来到学生管理系统! |')
  15.     print('+----------------------------+')
  16.     while True:
  17.         choice = menu()
  18.         if choice == 0:
  19.             sys.exit()
  20.         elif choice == 1:
  21.             insert()
  22.         elif choice == 2:
  23.             show()
  24.         elif choice == 3:
  25.             find()
  26.         elif choice == 4:
  27.             delete()
  28.         else:
  29.             print('您的输入有误!请重新输入!')
  30. if __name__ == '__main__':
  31.     main()
复制代码

2. 新增学生
  1. def insert():
  2.     print('[新增学生] 开始!')
  3.     student_id = input('请输入学生的学号:')
  4.     name = input('请输入学生的姓名:')
  5.     gender = input('请输入学生的性别:')
  6.     if gender not in ('男', '女'):
  7.         print('性别不符合要求!新增学生失败!')
  8.         return
  9.     class_name = input('请输入学生的班级:')
  10.     student = {
  11.         'studentId': student_id,
  12.         'name': name,
  13.         'gender': gender,
  14.         'className': class_name
  15.     }
  16.     global students
  17.     students.append(student)
  18.     save()
  19.     print('[新增学生] 完毕!')
复制代码

3. 显示学生
  1. def show():
  2.     print('[显示学生] 开始!')
  3.     for s in students:
  4.         print(s['studentId'], s['name'], s['gender'], s['className'], sep='\t')
  5.     print(f'[显示学生] 完毕!共显示了 {len(students)} 条记录!')
复制代码

4. 查找学生
  1. def find():
  2.     print('[查找学生] 开始!')
  3.     name = input('请输入要查找的同学姓名:')
  4.     count = 0
  5.     for s in students:
  6.         if name == s['name']:
  7.             print(s['studentId'], s['name'], s['gender'], s['className'], sep='\t')
  8.             count += 1
  9.     print(f'[查找学生] 完毕!共查找到 {count} 条记录!')
复制代码

5. 删除学生
  1. def delete():
  2.     print('[删除学生] 开始!')
  3.     student_id = input('请输入要删除的同学学号:')
  4.     count = 0
  5.     for s in students:
  6.         if student_id == s['studentId']:
  7.             print('删除', s['name'], '同学的信息!')
  8.             students.remove(s)
  9.             count += 1
  10.     save()
  11.     print(f'[删除学生] 完毕!共删除 {count} 条记录!')
复制代码

6. 存档与读档
约定存档文件为 d:/record.txt,每行一个学生,字段用制表符分隔。
存档:
  1. def save():
  2.     with open('d:/record.txt', 'w', encoding='utf8') as f:
  3.         for s in students:
  4.             f.write('{}\t{}\t{}\t{}\n'.format(s['studentId'], s['name'], s['gender'], s['className']))
  5.     print(f'[存档成功] 共存储了 {len(students)} 条记录!')
复制代码
读档:
  1. def load():
  2.     if not os.path.exists('d:/record.txt'):
  3.         return
  4.     global students
  5.     students = []
  6.     with open('d:/record.txt', 'r', encoding='utf8') as f:
  7.         for line in f:
  8.             line = line.strip()
  9.             if not line:
  10.                 continue
  11.             parts = line.split('\t')
  12.             student = {
  13.                 'studentId': parts[0],
  14.                 'name': parts[1],
  15.                 'gender': parts[2],
  16.                 'className': parts[3]
  17.             }
  18.             students.append(student)
复制代码
在 main() 开头调用 load(),程序启动时恢复数据。

7. 打包成 exe
安装 pyinstaller:
  1. pip install pyinstaller
复制代码
打包:
  1. pyinstaller -F 学生管理系统.py
复制代码
-F 表示打包成单个 exe。完成后在 dist 目录下找到 exe,可拷贝到没有 Python 环境的机器上运行。

四、总结
标准库是 Python 自带,import 即可用,如 datetime、os;第三方库需要 pip install,如 qrcode、xlrd、pynput。实际开发中要善于搜索、阅读文档、利用现成库。学生管理系统案例串联了函数、列表、字典、文件操作、异常处理等知识,打包成 exe 可以让程序在没有 Python 环境的机器上运行。库是编程的外挂,善用库,才能把精力集中在真正要解决的问题上。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-18 13:34 , Processed in 0.019189 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部