好的,各位同学,大家好!我是你们的Python全栈开发讲师。很高兴能和大家一起开启今天的课程——《Python基础与自动化脚本实战》。
在接下来的40分钟里,我不会带大家去啃枯燥的语法手册,而是会从一个真实的、能解决实际问题的角度出发,带大家领略Python的魅力。准备好了吗?让我们开始吧!
---
# Python基础与自动化脚本实战
想象一下,你每天早上上班,需要手动打开10个网页,复制粘贴几十个文件,或者重复地修改几百个Excel表格的名字。这些事情枯燥、耗时,还容易出错。
在当今这个数据驱动的时代,重复性的、机械化的手动操作是效率的最大杀手。无论是运维工程师、数据分析师、测试人员,还是普通的办公人员,都面临着大量的“手工活”。
Python,就是解决这个问题的终极武器。 它语法简洁、拥有强大的标准库和第三方库,被誉为“胶水语言”,可以轻松地将各种系统工具、文件、网络服务“粘合”在一起,实现自动化。
行业背景:
通过这40分钟的学习,你将具备以下能力:
1. 批量修改文件名: 瞬间给几百个图片或文档加上统一的日期前缀。 2. 自动化数据备份: 编写脚本,每天定时将重要文件夹压缩并复制到备份盘。 3. 自动发送报表邮件: 从数据库或文件中提取数据,生成图表,并自动发送给领导。 3. 系统健康检查: 写一个脚本,一键检查CPU、内存、磁盘使用率,并生成报告。 4. 定时执行任务: 让脚本在每天凌晨3点自动运行,而你只需要安心睡觉。
---
我们将通过4个核心模块,构建自动化脚本的基石。
原理讲解: 编程语言就像自然语言一样,有自己的“词汇”(变量、数据类型)和“句子”(控制流)。Python的“词汇”非常丰富,我们重点学习最常用的几种。
关键技术对比:列表 vs 字典
| 特性 | 列表 (List) | 字典 (Dict) |
| :--- | :--- | :--- |
| 表示 | 方括号 [] | 花括号 {} |
| 元素 | 有序的集合,用索引(0,1,2...)访问 | 无序的键值对,用键访问 |
| 示例 | names = [“小明”, “小红”, “小刚”] | person = {“name”: “小明”, “age”: 18} |
| 访问 | names[0] 得到 “小明” | person[“name”] 得到 “小明” |
| 适用场景 | 存储一系列相似的数据,如文件名列表 | 存储有映射关系的数据,如一个人的属性 |
代码示例:
# 1. 变量和数据类型
name = "张老师" # 字符串
age = 30 # 整数
salary = 15000.50 # 浮点数
is_teacher = True # 布尔值
# 2. 列表:存储多个文件名
file_list = ["report_1.txt", "report_2.txt", "report_3.txt"]
print(f"第一个文件是:{file_list[0]}") # 输出:第一个文件是:report_1.txt
# 3. 字典:描述一个文件的信息
file_info = {
"name": "report_1.txt",
"size": 1024, # 单位:KB
"is_backup": False
}
print(f"文件 {file_info['name']} 的大小是:{file_info['size']} KB")
# 4. 循环:批量处理列表中的元素
for file in file_list:
print(f"正在处理:{file}")
模块二:文件操作——脚本与硬盘的“桥梁”
原理讲解:
自动化脚本的核心就是操作文件。Python内置的open()函数是操作文件的万能钥匙。我们主要使用 with 语句,它能自动管理文件的打开和关闭,非常安全。
关键参数说明:open() 函数的模式
| 模式 | 描述 |
| :--- | :--- |
| 'r' | 读取模式(默认)。文件必须存在。 |
| 'w' | 写入模式。如果文件存在,会覆盖内容;如果不存在,会创建新文件。 |
| 'a' | 追加模式。在文件末尾添加内容,不会覆盖原有内容。 |
| 'rb' / 'wb' | 二进制模式读取/写入(用于图片、视频等非文本文件)。 |
代码示例:
# 1. 读取文件内容
with open('my_data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 2. 写入内容到文件
with open('output.txt', 'w', encoding='utf-8') as f:
f.write("这是第一行内容。\n")
f.write("这是第二行内容。\n")
print("文件写入成功!")
# 3. 追加内容
with open('output.txt', 'a', encoding='utf-8') as f:
f.write("这是追加的一行。\n")
print("内容追加成功!")
模块三:常用标准库——Python的“军火库”
原理讲解:
Python的强大之处在于其“内置电池”(Batteries Included)的理念,即标准库。我们不需要自己写所有代码,直接导入别人写好的、经过测试的高质量模块即可。
- **`os` 模块:** 与操作系统交互,如创建文件夹、获取路径、执行系统命令。
- **`shutil` 模块:** 高级文件操作,如复制、移动、删除文件和整个目录。
- **`datetime` 模块:** 处理日期和时间,非常方便。
- **`subprocess` 模块:** 在Python脚本中运行外部程序或系统命令。
代码示例:
import os
import shutil
from datetime import datetime
# 1. 使用os模块创建文件夹
today = datetime.now().strftime("%Y-%m-%d") # 获取今天的日期字符串,如 "2023-10-27"
backup_dir = f"backup_{today}"
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
print(f"已创建备份文件夹:{backup_dir}")
# 2. 使用shutil复制文件
source_file = "important_data.txt"
dest_file = os.path.join(backup_dir, "important_data_backup.txt")
shutil.copy2(source_file, dest_file) # copy2会保留文件的元数据(修改时间等)
print(f"文件已复制到:{dest_file}")
# 3. 使用datetime记录操作时间
print(f"备份完成时间:{datetime.now()}")
模块四:异常处理——让脚本更“健壮”
原理讲解:
程序运行中难免会遇到意外,比如文件找不到、网络断开、权限不足。如果不处理,程序会直接崩溃。try...except 语句就像一个“安全网”,可以优雅地捕获并处理这些错误,让程序继续运行下去。
代码示例:
import os
def read_file_safely(file_path):
"""安全地读取文件,如果出错则返回None"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return content
except FileNotFoundError:
print(f"错误:文件 {file_path} 不存在!")
return None
except PermissionError:
print(f"错误:没有权限读取文件 {file_path}!")
return None
except Exception as e: # 捕获其他所有类型的异常
print(f"发生未知错误:{e}")
return None
# 测试
result = read_file_safely("一个不存在的文件.txt")
if result is None:
print("文件读取失败,但程序没有崩溃!")
---
三、实操步骤:构建一个“每日工作环境检查与备份”脚本
我们将把上面的知识点串联起来,写一个实用的自动化脚本。
目标: 每天早上运行此脚本,自动完成以下任务:
1. 检查当前目录下是否存在 data 文件夹,如果没有则创建。
2. 将 data 文件夹压缩成 zip 文件。
3. 在压缩包文件名上添加当天的日期。
4. 将压缩包移动到 backup 文件夹(如果没有则创建)。
5. 记录所有操作日志。
步骤:
1. 创建脚本文件: 在你的工作目录下,新建一个文本文档,命名为 daily_backup.py。
2. 导入所需模块: 在文件顶部写入以下代码。
import os
import shutil
from datetime import datetime
import zipfile # 用于创建zip压缩包
3. 定义关键路径和日期:
# 获取当前日期
today = datetime.now().strftime("%Y-%m-%d")
# 定义源文件夹和目标文件夹
source_dir = "data"
backup_dir = "backup"
4. 创建目标文件夹(如果不存在):
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
print(f"已创建备份文件夹:{backup_dir}")
5. 检查源文件夹是否存在:
if not os.path.exists(source_dir):
print(f"错误:源文件夹 '{source_dir}' 不存在!")
exit(1) # 退出脚本,并返回错误代码1
6. 创建压缩包:
# 压缩包的文件名,例如:data_backup_2023-10-27.zip
zip_filename = f"data_backup_{today}.zip"
zip_path = os.path.join(backup_dir, zip_filename)
print(f"正在创建压缩包:{zip_path} ...")
# 使用shutil.make_archive可以更简单地创建zip
# 第一个参数是压缩包名(不含扩展名),第二个是格式,第三个是要压缩的目录
shutil.make_archive(base_name=zip_path.replace('.zip', ''),
format='zip',
root_dir=source_dir)
print("压缩包创建成功!")
7. 记录日志:
log_filename = "backup_log.txt"
log_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_message = f"[{log_time}] 备份成功:{zip_filename}\n"
with open(log_filename, 'a', encoding='utf-8') as log_file:
log_file.write(log_message)
print(f"日志已记录到:{log_filename}")
print("所有任务完成!")
8. 运行脚本:
- **Windows:** 在脚本所在目录的地址栏输入 `cmd` 并回车,然后在命令行中输入 `python daily_backup.py`。
- **macOS / Linux:** 打开终端,`cd` 到脚本目录,输入 `python3 daily_backup.py`。
预期效果:
- 你会看到命令行输出一系列提示信息。
- 当前目录下会生成一个 `backup` 文件夹。
- `backup` 文件夹内会有一个名为 `data_backup_2023-10-27.zip`(日期为当天)的压缩包。
- 当前目录下会生成一个 `backup_log.txt` 文件,里面记录了刚才的操作。
---
四、常见问题与故障排查
1. 问题:运行脚本时提示 'python' 不是内部或外部命令,也不是可运行的程序。
- **判断思路:** 系统环境变量中没有配置Python的路径。
- **解决方法:**
- 重新安装Python,在安装向导中务必勾选“**Add Python to PATH**”。
- 或者,找到Python的安装目录(如 `C:\Python39\`),将其下的 `Scripts` 文件夹路径添加到系统环境变量 `Path` 中。
2. 问题:运行脚本后,压缩包是空的。
- **判断思路:** 压缩时指定的源文件夹路径不正确,或者源文件夹内没有文件。
- **排查流程:**
1. 检查 source_dir = "data" 这个路径是否真实存在。
2. 检查 data 文件夹是否位于脚本所在的目录下。
3. 打开 data 文件夹,确认里面确实有文件。
4. 尝试在脚本中打印 os.path.abspath(source_dir) 来确认绝对路径。
3. 问题:脚本运行时报错 FileNotFoundError: [Errno 2] No such file or directory: 'backup_log.txt'。
- **判断思路:** 这不是真正的错误,而是 `open()` 函数以 `'r'` 模式打开文件时才会报错。我们的日志写入使用的是 `'a'` 模式,如果文件不存在,它会自动创建。
- **排查流程:** 检查你的日志写入代码,确认使用的是 `'a'` (append) 模式而不是 `'r'` (read) 模式。如果使用了 `'r+'` 或 `'w'`,需要注意文件是否存在。
4. 问题:我想让脚本每天定时运行,而不需要手动执行。
- **判断思路:** 这是定时任务的需求,需要借助操作系统的任务调度器。
- **解决方法(Windows):**
1. 打开“任务计划程序”。
2. 创建基本任务,设置触发器为“每天”,时间设为凌晨3点。
3. 操作选择“启动程序”,程序或脚本选择 python.exe 的完整路径(如 C:\Python39\python.exe),添加参数选择你的脚本路径(如 C:\my_scripts\daily_backup.py)。
- **解决方法(macOS / Linux):**
1. 在终端输入 crontab -e 编辑定时任务。
2. 添加一行:0 3 * * * /usr/bin/python3 /path/to/your/daily_backup.py。
---
五、总结与扩展
重点知识回顾
1. 三大数据结构: 列表(有序集合)、字典(键值对)、字符串(文本)。它们是自动化脚本处理数据的基石。
2. 文件操作三剑客: open() 函数配合 'r'、'w'、'a' 模式,是读写文件的万能钥匙。永远记得使用 with 语句。
3. 标准库的力量: os、shutil、datetime、subprocess 等库,让你无需重复造轮子,直接调用系统能力。
4. 异常处理: try...except 是脚本的“安全带”,让程序在遇到错误时也能优雅地处理,而不是直接崩溃。
5. “脚本思维”: 将手动操作拆解成“输入 -> 处理 -> 输出”的流程,然后用代码实现这个流程。
实战中的最佳实践建议
- **从简单开始:** 不要试图一次写完一个复杂的脚本。先实现一个核心功能,比如只复制文件,运行成功后再增加压缩、日志等功能。
- **多用打印:** 在脚本的关键位置添加 `print()` 语句,打印出变量的值或“正在执行...”,这能帮你快速定位问题。
- **写注释:** 即使脚本是给自己用的,一周后你也可能忘记某段代码的用途。用 `#` 写下简单的注释。
- **版本控制:** 用Git来管理你的脚本,这样你可以随时回退到之前的版本。
推荐进一步学习的方向和资源
- **深入学习:**
- **数据处理:** 学习 `pandas` 库,处理Excel、CSV等表格数据。
- **网络请求:** 学习 `requests` 库,编写爬虫或调用API。
- **图形界面:** 学习 `PySimpleGUI` 或 `Tkinter`,为你的脚本做个简单的界面。
- **学习资源:**
- **官方文档:** Python官方文档是最好的老师。
- **在线平台:** LeetCode(刷题)、Real Python(优质教程)。
- **书籍:** 《Python编程:从入门到实践》(非常适合巩固基础)。
今天的课程到这里就结束了。希望大家不只是“看”会了,而是能动手把那个备份脚本写出来,并试着修改它,让它完成更多你需要的任务。编程是一门实践的艺术,动手敲代码,才是最快的进步方式!
有任何问题,欢迎随时交流。我们下次课再见!