最近更新:Python中级教程 第六课:高级特性与性能优化 1/2
2026-01-15
最近更新:Python中级教程 第五课:异步编程与并发 2/2
2026-01-15
最近更新:Python中级教程 第五课:异步编程与并发 1/2
2026-01-15
最近更新:Python中级教程 第四课:上下文管理器、生成器与迭代器
2026-01-15
最近更新:Python中级教程 第三课:面向对象编程深入与装饰器
2026-01-15
浏览量:57 次 发布时间:2026-01-15 18:03 作者:明扬工控商城 下载docx
最近更新:Python中级教程 第六课:高级特性与性能优化 1/2
2026-01-15
最近更新:Python中级教程 第五课:异步编程与并发 2/2
2026-01-15
最近更新:Python中级教程 第五课:异步编程与并发 1/2
2026-01-15
最近更新:Python中级教程 第四课:上下文管理器、生成器与迭代器
2026-01-15
最近更新:Python中级教程 第三课:面向对象编程深入与装饰器
2026-01-15
欢迎来到Python中级教程第二课。上节课我们学习了字典和集合,今天要学习文件处理的高级技巧。在实际工作中,我们经常需要处理各种格式的文件,比如JSON配置文件、Excel表格、PDF文档等。学会这些技能,你就能让Python帮你自动化处理很多文件相关的工作。
第一部分 准备工作
在开始之前,我们需要安装一些第三方库。打开命令行,运行以下命令:
text
pip install openpyxl
pip install PyPDF2
pip install python-docx
这些库分别是:
openpyxl:处理Excel文件
PyPDF2:处理PDF文件
python-docx:处理Word文档
如果你已经安装过,可以跳过这一步。
第二部分 JSON文件处理
JSON是目前最常用的数据交换格式之一,很多配置文件、API返回数据都使用JSON格式。
2.1 JSON基础操作
代码部分:
JSON文件处理基础
import json
示例数据
学生数据 = {
"班级": "计算机一班",
"人数": 30,
"学生列表": [
{"姓名": "张三", "学号": "2023001", "成绩": 85},
{"姓名": "李四", "学号": "2023002", "成绩": 92},
{"姓名": "王五", "学号": "2023003", "成绩": 78}
]
}
写入JSON文件
print("1. 写入JSON文件")
with open("学生数据.json", "w", encoding="utf-8") as 文件:
json.dump(学生数据, 文件, ensure_ascii=False, indent=2)
print("数据已保存到 学生数据.json")
读取JSON文件
print("\n2. 读取JSON文件")
with open("学生数据.json", "r", encoding="utf-8") as 文件:
读取的数据 = json.load(文件)
print(f"班级:{读取的数据['班级']}")
print(f"人数:{读取的数据['人数']}")
print("学生列表:")
for 学生 in 读取的数据["学生列表"]:
print(f" 姓名:{学生['姓名']},学号:{学生['学号']},成绩:{学生['成绩']}")
将Python对象转换为JSON字符串
print("\n3. 将Python对象转换为JSON字符串")
json字符串 = json.dumps(学生数据, ensure_ascii=False, indent=2)
print("JSON字符串前100个字符:")
print(json字符串[:100] + "...")
将JSON字符串转换为Python对象
print("\n4. 将JSON字符串转换为Python对象")
python对象 = json.loads(json字符串)
print(f"转换后的班级:{python对象['班级']}")
2.2 处理复杂JSON数据
实际工作中,JSON数据可能很复杂,需要一些技巧来处理。
代码部分:
处理复杂JSON数据
import json
复杂JSON示例
复杂数据 = {
"公司": {
"名称": "科技公司",
"部门": {
"技术部": {
"员工": [
{"姓名": "张三", "职位": "工程师", "技能": ["Python", "Java", "数据库"]},
{"姓名": "李四", "职位": "架构师", "技能": ["系统设计", "微服务", "云计算"]}
],
"经理": "王五"
},
"市场部": {
"员工": [
{"姓名": "赵六", "职位": "市场专员", "负责区域": ["北京", "上海"]}
],
"经理": "孙七"
}
},
"地址": {
"总部": "北京市",
"分公司": ["上海", "广州", "深圳"]
}
}
}
写入复杂JSON文件
with open("公司数据.json", "w", encoding="utf-8") as 文件:
json.dump(复杂数据, 文件, ensure_ascii=False, indent=2)
读取并处理复杂JSON
def 处理复杂json(文件路径):
with open(文件路径, "r", encoding="utf-8") as 文件:
数据 = json.load(文件)
text
提取所有员工信息
所有员工 = []
for 部门名称, 部门信息 in 数据["公司"]["部门"].items():
for 员工 in 部门信息["员工"]:
员工信息 = {
"姓名": 员工["姓名"],
"职位": 员工["职位"],
"部门": 部门名称,
"经理": 部门信息["经理"]
}
if "技能" in 员工:
员工信息["技能"] = 员工["技能"]
if "负责区域" in 员工:
员工信息["负责区域"] = 员工["负责区域"]
所有员工.append(员工信息)
return 所有员工
使用函数处理数据
员工列表 = 处理复杂json("公司数据.json")
print("公司所有员工信息:")
for 员工 in 员工列表:
print(f" 姓名:{员工['姓名']},职位:{员工['职位']},部门:{员工['部门']}")
2.3 JSON文件配置管理
JSON文件非常适合存储配置信息。
代码部分:
JSON配置文件管理
import json
import os
class 配置管理器:
def init(self, 配置文件路径="配置.json"):
self.配置文件路径 = 配置文件路径
self.配置 = self.加载配置()
text
def 加载配置(self):
如果配置文件存在,则加载;否则返回默认配置
if os.path.exists(self.配置文件路径):
try:
with open(self.配置文件路径, "r", encoding="utf-8") as 文件:
return json.load(文件)
except Exception as e:
print(f"加载配置文件失败:{e}")
return self.获取默认配置()
else:
print("配置文件不存在,使用默认配置")
return self.获取默认配置()
def 获取默认配置(self):
返回默认配置
return {
"应用": {
"名称": "我的应用",
"版本": "1.0.0",
"作者": "开发者"
},
"数据库": {
"主机": "localhost",
"端口": 3306,
"用户名": "root",
"密码": "",
"数据库名": "mydb"
},
"日志": {
"级别": "INFO",
"文件路径": "logs/app.log",
"最大文件大小": "10MB",
"保留天数": 30
},
"功能开关": {
"启用缓存": True,
"启用通知": False,
"调试模式": False
}
}
def 保存配置(self):
保存配置到文件
try:
with open(self.配置文件路径, "w", encoding="utf-8") as 文件:
json.dump(self.配置, 文件, ensure_ascii=False, indent=2)
print(f"配置已保存到 {self.配置文件路径}")
return True
except Exception as e:
print(f"保存配置失败:{e}")
return False
def 获取配置项(self, 键, 默认值=None):
获取配置项,支持点分隔的键,如"数据库.主机"
try:
键列表 = 键.split(".")
当前值 = self.配置
for k in 键列表:
当前值 = 当前值[k]
return 当前值
except (KeyError, AttributeError):
return 默认值
def 设置配置项(self, 键, 值):
设置配置项,支持点分隔的键
try:
键列表 = 键.split(".")
当前字典 = self.配置
遍历到最后一个键的前一个
for k in 键列表[:-1]:
if k not in 当前字典:
当前字典[k] = {}
当前字典 = 当前字典[k]
设置值
当前字典[键列表[-1]] = 值
return True
except Exception as e:
print(f"设置配置项失败:{e}")
return False
def 显示配置(self):
显示所有配置
print("当前配置:")
print(json.dumps(self.配置, ensure_ascii=False, indent=2))
使用配置管理器
def 演示配置管理():
配置 = 配置管理器("我的应用配置.json")
text
显示当前配置
配置.显示配置()
获取特定配置项
print("\n获取特定配置项:")
print(f"数据库主机:{配置.获取配置项('数据库.主机')}")
print(f"日志级别:{配置.获取配置项('日志.级别')}")
print(f"不存在的配置项:{配置.获取配置项('不存在的.键', '默认值')}")
修改配置项
print("\n修改配置项:")
配置.设置配置项("数据库.主机", "127.0.0.1")
配置.设置配置项("功能开关.调试模式", True)
配置.设置配置项("新功能.测试", "这是一个测试")
显示修改后的配置
配置.显示配置()
保存配置
配置.保存配置()
return 配置
if name == "main":
演示配置管理()
第三部分 Excel文件处理
Excel是办公中最常用的表格工具,Python可以自动化处理Excel文件。
3.1 创建和写入Excel文件
代码部分:
Excel文件处理基础
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
创建新的Excel工作簿
def 创建学生成绩表(文件名="学生成绩.xlsx"):
工作簿 = Workbook()
工作表 = 工作簿.active
工作表.title = "学生成绩"
text
设置表头
表头 = ["学号", "姓名", "语文", "数学", "英语", "总分", "平均分"]
工作表.append(表头)
设置表头样式
表头字体 = Font(bold=True, color="FFFFFF", size=12)
表头填充 = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
for cell in 工作表[1]:
cell.font = 表头字体
cell.fill = 表头填充
cell.alignment = Alignment(horizontal="center")
添加学生数据
学生数据 = [
["2023001", "张三", 85, 92, 88],
["2023002", "李四", 92, 88, 95],
["2023003", "王五", 78, 85, 80],
["2023004", "赵六", 88, 90, 85],
["2023005", "孙七", 95, 96, 92]
]
for 数据 in 学生数据:
总分 = sum(数据[2:5]) 语文、数学、英语
平均分 = 总分 / 3
行数据 = 数据 + [总分, round(平均分, 2)]
工作表.append(行数据)
调整列宽
列宽 = {"A": 12, "B": 10, "C": 8, "D": 8, "E": 8, "F": 8, "G": 10}
for 列, 宽度 in 列宽.items():
工作表.column_dimensions[列].width = 宽度
为前三名添加颜色
按总分排序
所有行 = list(工作表.iter_rows(min_row=2, values_only=False))
所有行.sort(key=lambda row: row[5].value, reverse=True) 按总分列排序
前三名填充 = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
for i in range(min(3, len(所有行))):
for cell in 所有行[i]:
cell.fill = 前三名填充
保存文件
工作簿.save(文件名)
print(f"Excel文件已创建:{文件名}")
return 文件名
创建Excel文件
excel文件 = 创建学生成绩表()
3.2 读取Excel文件
代码部分:
读取Excel文件
from openpyxl import load_workbook
def 读取excel文件(文件名):
工作簿 = load_workbook(文件名, data_only=True) data_only=True获取计算后的值
工作表 = 工作簿.active
text
print(f"工作表名称:{工作表.title}")
print(f"最大行数:{工作表.max_row}")
print(f"最大列数:{工作表.max_column}")
读取所有数据
所有数据 = []
for 行 in 工作表.iter_rows(min_row=2, values_only=True): 跳过表头
所有数据.append(行)
打印数据
print("\n学生成绩数据:")
print("学号 姓名 语文 数学 英语 总分 平均分")
print("-" * 50)
for 行数据 in 所有数据:
print(f"{行数据[0]:10} {行数据[1]:6} {行数据[2]:4} {行数据[3]:4} {行数据[4]:4} {行数据[5]:4} {行数据[6]:6.2f}")
计算统计信息
计算统计信息(所有数据)
return 所有数据
def 计算统计信息(数据):
语文成绩 = [行[2] for 行 in 数据]
数学成绩 = [行[3] for 行 in 数据]
英语成绩 = [行[4] for 行 in 数据]
总成绩 = [行[5] for 行 in 数据]
text
print("\n统计信息:")
print("-" * 40)
print(f"语文平均分:{sum(语文成绩)/len(语文成绩):.2f}")
print(f"数学平均分:{sum(数学成绩)/len(数学成绩):.2f}")
print(f"英语平均分:{sum(英语成绩)/len(英语成绩):.2f}")
print(f"总平均分:{sum(总成绩)/len(总成绩):.2f}")
print(f"最高总分:{max(总成绩)}")
print(f"最低总分:{min(总成绩)}")
print("-" * 40)
读取之前创建的Excel文件
if name == "main":
数据 = 读取excel文件("学生成绩.xlsx")
3.3 Excel数据处理与转换
代码部分:
Excel数据处理与转换
from openpyxl import Workbook, load_workbook
def 处理多个excel文件(文件列表, 输出文件="合并数据.xlsx"):
合并多个Excel文件的数据
text
合并工作簿 = Workbook()
合并工作表 = 合并工作簿.active
合并工作表.title = "合并数据"
设置表头
表头 = ["来源文件", "学号", "姓名", "语文", "数学", "英语", "总分"]
合并工作表.append(表头)
所有数据 = []
for 文件名 in 文件列表:
try:
工作簿 = load_workbook(文件名, data_only=True)
工作表 = 工作簿.active
从第二行开始读取数据
for 行 in 工作表.iter_rows(min_row=2, values_only=True):
if 行 and len(行) >= 6: 确保有足够的数据
来源 = 文件名
学号 = 行[0]
姓名 = 行[1]
语文 = 行[2]
数学 = 行[3]
英语 = 行[4]
总分 = 行[5]
新行 = [来源, 学号, 姓名, 语文, 数学, 英语, 总分]
合并工作表.append(新行)
所有数据.append(新行)
print(f"已处理文件:{文件名}")
except Exception as e:
print(f"处理文件 {文件名} 时出错:{e}")
保存合并文件
合并工作簿.save(输出文件)
print(f"数据已合并到:{输出文件}")
return 所有数据
def 筛选excel数据(输入文件, 输出文件, 筛选条件):
根据条件筛选Excel数据
text
工作簿 = load_workbook(输入文件, data_only=True)
工作表 = 工作簿.active
新工作簿 = Workbook()
新工作表 = 新工作簿.active
新工作表.title = "筛选结果"
复制表头
表头 = [cell.value for cell in 工作表[1]]
新工作表.append(表头)
符合条件的行数 = 0
遍历数据行
for 行 in 工作表.iter_rows(min_row=2, values_only=False):
获取单元格值
行数据 = [cell.value for cell in 行]
检查筛选条件
符合条件 = True
if 筛选条件.get("最小总分"):
if 行数据[5] < 筛选条件["最小总分"]: 假设总分在第6列
符合条件 = False
if 筛选条件.get("科目条件"):
for 科目, 最低分 in 筛选条件["科目条件"].items():
科目索引 = {"语文": 2, "数学": 3, "英语": 4}.get(科目)
if 科目索引 and 行数据[科目索引] < 最低分:
符合条件 = False
if 符合条件:
新工作表.append(行数据)
符合条件的行数 += 1
新工作簿.save(输出文件)
print(f"筛选完成,共找到 {符合条件的行数} 条符合条件的记录")
print(f"结果已保存到:{输出文件}")
return 符合条件的行数
使用示例
if name == "main":
首先创建几个测试文件
for i in range(1, 4):
创建学生成绩表(f"班级{i}成绩.xlsx")
text
处理多个文件
文件列表 = ["班级1成绩.xlsx", "班级2成绩.xlsx", "班级3成绩.xlsx"]
合并数据 = 处理多个excel文件(文件列表, "所有班级成绩.xlsx")
筛选数据
筛选条件 = {
"最小总分": 250,
"科目条件": {"数学": 85}
}
筛选excel数据("所有班级成绩.xlsx", "高分学生.xlsx", 筛选条件)
第四部分 PDF文件处理
PDF是常用的文档格式,我们可以用Python提取PDF中的文本信息。
4.1 提取PDF文本
代码部分:
PDF文件处理
import PyPDF2
def 提取pdf文本(pdf文件路径):
提取PDF文件中的文本
text
try:
with open(pdf文件路径, "rb") as 文件:
读取器 = PyPDF2.PdfReader(文件)
页数 = len(读取器.pages)
print(f"PDF文件:{pdf文件路径}")
print(f"总页数:{页数}")
提取所有页的文本
所有文本 = ""
for 页码 in range(页数):
页面 = 读取器.pages[页码]
文本 = 页面.extract_text()
所有文本 += f"\n=== 第{页码+1}页 ===\n{文本}"
return 所有文本, 页数
except FileNotFoundError:
print(f"文件不存在:{pdf文件路径}")
return "", 0
except Exception as e:
print(f"处理PDF文件时出错:{e}")
return "", 0
def 保存pdf文本到文件(pdf文件路径, 输出文件路径):
提取PDF文本并保存到文件
text
文本, 页数 = 提取pdf文本(pdf文件路径)
if 文本:
with open(输出文件路径, "w", encoding="utf-8") as 输出文件:
输出文件.write(文本)
print(f"PDF文本已保存到:{输出文件路径}")
print(f"共提取了 {页数} 页内容")
return True
else:
print("未能提取PDF文本")
return False
def 搜索pdf中的关键词(pdf文件路径, 关键词):
在PDF中搜索关键词
text
文本, 页数 = 提取pdf文本(pdf文件路径)
if not 文本:
return []
按页分割文本
页文本列表 = 文本.split("===")[1:] 跳过第一个空元素
结果 = []
for 页内容 in 页文本列表:
if "页 ===" in 页内容:
页头, 内容 = 页内容.split("\n", 1)
页码 = 页头.split("第")[1].split("页")[0]
if 关键词.lower() in 内容.lower():
找到位置 = 内容.lower().index(关键词.lower())
上下文开始 = max(0, 找到位置 - 50)
上下文结束 = min(len(内容), 找到位置 + len(关键词) + 50)
上下文 = 内容[上下文开始:上下文结束]
结果.append({
"页码": int(页码),
"上下文": 上下文,
"位置": 找到位置
})
print(f"在PDF中搜索关键词 '{关键词}',共找到 {len(结果)} 处")
for 匹配 in 结果[:5]: 只显示前5个匹配
print(f" 第{匹配['页码']}页:...{匹配['上下文']}...")
return 结果
示例使用
if name == "main":
由于我们没有实际的PDF文件,这里只展示函数用法
print("PDF处理功能演示")
print("=" * 50)
text
实际使用时,需要替换为真实的PDF文件路径
示例用法:
提取pdf文本("文档.pdf")
保存pdf文本到文件("文档.pdf", "文档.txt")
搜索pdf中的关键词("文档.pdf", "Python")
print("\n注意:请将示例中的文件名替换为实际文件名")
4.2 简单的PDF操作
代码部分:
简单PDF操作
import PyPDF2
def 合并pdf文件(文件列表, 输出文件路径):
合并多个PDF文件
text
try:
合并器 = PyPDF2.PdfMerger()
for 文件路径 in 文件列表:
with open(文件路径, "rb") as 文件:
合并器.append(文件)
with open(输出文件路径, "wb") as 输出文件:
合并器.write(输出文件)
print(f"PDF文件已合并到:{输出文件路径}")
print(f"合并了 {len(文件列表)} 个文件")
return True
except Exception as e:
print(f"合并PDF文件时出错:{e}")
return False
def 拆分pdf文件(输入文件路径, 输出目录, 页码范围=None):
拆分PDF文件
text
try:
with open(输入文件路径, "rb") as 文件:
读取器 = PyPDF2.PdfReader(文件)
总页数 = len(读取器.pages)
if 页码范围 is None:
页码范围 = [(1, 总页数)]
拆分编号 = 1
for 开始页, 结束页 in 页码范围:
写入器 = PyPDF2.PdfWriter()
for 页码 in range(开始页-1, min(结束页, 总页数)):
写入器.add_page(读取器.pages[页码])
输出文件路径 = f"{输出目录}/拆分_{拆分编号}.pdf"
with open(输出文件路径, "wb") as 输出文件:
写入器.write(输出文件)
print(f"已保存:{输出文件路径}(第{开始页}到第{结束页}页)")
拆分编号 += 1
return True
except Exception as e:
print(f"拆分PDF文件时出错:{e}")
return False
示例使用
if name == "main":
print("PDF合并与拆分演示")
print("=" * 50)
text
示例用法:
合并pdf文件(["文档1.pdf", "文档2.pdf"], "合并文档.pdf")
拆分pdf文件("大文档.pdf", "输出目录", [(1, 10), (11, 20)])
print("\n注意:请将示例中的文件名替换为实际文件名")
第五部分 实战项目 自动整理桌面文件工具
将本文的Word文档下载到电脑
推荐度: