8.9 文档操作
8.9.1 csv文件
CSV (逗号分隔值)文件是一种常见的表格数据交换格式,广泛用于数据导入导出、日志记录等场景。Python标准库中的 csv 模块,专门用于处理 CSV 格式的文件,支持 CSV 数据的读取和写入操作。
核心功能
- 读取 CSV 文件并解析为 Python 可处理的数据结构(如列表、字典)
- 将 Python 数据结构写入为 CSV 格式文件
- 支持自定义分隔符、引号字符、编码等参数,处理不同格式的 CSV 文件
主要类和函数
- csv.reader:以列表形式读取 CSV 文件
- csv.DictReader:以字典形式读取 CSV 文件(使用首行作为键)
- csv.writer:以列表形式写入数据到 CSV 文件
- csv.DictWriter:以字典形式写入数据到 CSV 文件
举例:
import csv
# 1. 写入CSV文件
data = [
["姓名", "年龄", "城市"],
["张三", 25, "北京"],
["李四", 30, "上海"],
["王五", 28, "广州"]
]
# 使用writer写入(列表形式)
with open("people.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
# 写入多行
writer.writerows(data)
# 也可单行写入:writer.writerow(["赵六", 35, "深圳"])
# 2. 读取CSV文件(列表形式)
print("以列表形式读取:")
with open("people.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 3. 使用DictWriter写入(字典形式)
fieldnames = ["姓名", "年龄", "城市"]
dict_data = [
{"姓名": "孙七", "年龄": 40, "城市": "杭州"},
{"姓名": "周八", "年龄": 33, "城市": "成都"}
]
with open("people_dict.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(dict_data) # 写入数据行
# 4. 使用DictReader读取(字典形式)
print("\n以字典形式读取:")
with open("people_dict.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(f"{row['姓名']},{row['年龄']}岁,来自{row['城市']}")
运行中创建people.csv文件为:
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,广州
参数说明
- newline="":在写入时避免多余的空行(Windows 系统尤为重要)
- encoding="utf-8":指定文件编码,确保中文等字符正常读写
- delimiter:自定义分隔符(默认是逗号 ,,可改为 \t 处理 TSV 文件)
- quotechar:设置引号字符,用于包含包含分隔符的字段
8.9.2 excel文件
openpyxl 是 Python 中用于读写 Excel 2007+ 格式(.xlsx、.xlsm 等)文件的流行库,支持复杂的表格操作,是处理 Excel 文件的常用工具。
主要功能
- 读取和修改现有 Excel 文件
- 创建新的 Excel 工作簿和工作表
- 操作单元格(读写值、设置格式、合并单元格等)
- 处理表格样式、公式、图表等元素
安装
pip install openpyxl
核心对象关系
- Workbook:工作簿(整个 Excel 文件)
- Worksheet:工作表(单个表格页)
- Cell:单元格(工作表中的单个格子)
通过 Workbook 和 Worksheet 对象创建工作簿,创建、重命名、删除、复制工作表;通过 cell() 方法访问单元格,iter_rows()/iter_cols() 批量读取行 / 列。
举例:
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Alignment
# 1. 创建新的Excel文件并写入数据
def create_excel():
# 创建工作簿
wb = Workbook()
# 获取默认工作表(第一个表)
ws = wb.active
ws.title = "学生信息" # 设置工作表名称
# 写入表头
headers = ["学号", "姓名", "年龄", "专业"]
for col, header in enumerate(headers, 1): # 列从1开始
cell = ws.cell(row=1, column=col)
cell.value = header
# 设置表头样式(加粗、居中)
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal="center")
# 写入数据
students = [
("001", "张三", 20, "计算机科学"),
("002", "李四", 21, "软件工程"),
("003", "王五", 19, "数据科学")
]
for row, student in enumerate(students, 2): # 数据从第2行开始
for col, value in enumerate(student, 1):
ws.cell(row=row, column=col, value=value)
# 调整列宽
ws.column_dimensions["A"].width = 10
ws.column_dimensions["B"].width = 15
ws.column_dimensions["C"].width = 8
ws.column_dimensions["D"].width = 15
# 保存文件
wb.save("students.xlsx")
print("Excel文件创建成功!")
# 2. 读取已有的Excel文件
def read_excel():
# 加载工作簿
wb = load_workbook("students.xlsx")
# 获取所有工作表名称
print("工作表列表:", wb.sheetnames)
# 选择要操作的工作表
ws = wb["学生信息"]
# 读取数据(按行读取)
print("\n学生信息:")
for row in ws.iter_rows(min_row=2, values_only=True): # 从第2行开始,只获取值
print(f"学号:{row[0]}, 姓名:{row[1]}, 年龄:{row[2]}, 专业:{row[3]}")
# 读取单个单元格
cell_value = ws.cell(row=2, column=2).value
print(f"\n第2行第2列的值:{cell_value}")
# 3. 修改已有Excel文件
def update_excel():
wb = load_workbook("students.xlsx")
ws = wb["学生信息"]
# 添加新行
new_student = ("004", "赵六", 22, "人工智能")
ws.append(new_student)
# 修改单元格值
ws.cell(row=2, column=3).value = 21 # 将张三的年龄改为21
# 合并单元格
ws.merge_cells("E1:F1")
ws["E1"].value = "备注"
ws["E1"].alignment = Alignment(horizontal="center")
# 保存修改
wb.save("students_updated.xlsx")
print("\nExcel文件更新成功!")
if __name__ == "__main__":
create_excel()
read_excel()
update_excel()