Python中级教程第二课 文件处理专家 1/2

浏览量:57 次 发布时间:2026-01-15 18:03 作者:明扬工控商城 下载docx

最近更新:Python中级教程 第三课:面向对象编程深入与装饰器

欢迎来到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注意:请将示例中的文件名替换为实际文件名")

第五部分 实战项目 自动整理桌面文件工具


明扬工控商城

推荐阅读:

Python中级教程 第六课:高级特性与性能优化 2/2

Python中级教程 第六课:高级特性与性能优化 1/2

Python中级教程 第五课:异步编程与并发 2/2

Python中级教程 第五课:异步编程与并发 1/2

Python中级教程 第四课:上下文管理器、生成器与迭代器

Python中级教程 第三课:面向对象编程深入与装饰器

热门标签:
Python中级教程第二课 文件处理专家 1/2.docx

将本文的Word文档下载到电脑

推荐度:

下载

全部评论

请登录
产业新闻-明扬资讯网
科技资讯-明扬资讯网