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()