系列文章

Python 从入门到精通

第 27 / 36 篇

从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。

  1. 01
    Python 怎么装、怎么用
  2. 02
    变量、数字和字符串
  3. 03
    列表:把一组数据放在一起
  4. 04
    元组、集合和字典
  5. 05
    条件判断:让程序做选择
  6. 06
    循环:重复的事交给程序
  7. 07
    函数:把代码整理成可复用的块
  8. 08
    模块与包:拆分你的程序
  9. 09
    输入、输出与字符串格式化
  10. 10
    文件读写:保存程序的数据
  11. 11
    异常处理:程序出错时怎么办
  12. 12
    基础阶段练习:命令行记账本
  13. 13
    类和对象:面向对象入门
  14. 14
    继承、组合与特殊方法
  15. 15
    迭代器与生成器
  16. 16
    列表推导式与生成器表达式
  17. 17
    装饰器:给函数增加能力
  18. 18
    上下文管理器与 with
  19. 19
    类型标注与 dataclass
  20. 20
    正则表达式:从文本中找规律
  21. 21
    日期、时间与时区
  22. 22
    日志与调试
  23. 23
    虚拟环境与依赖管理
  24. 24
    测试:让修改不再提心吊胆
  25. 25
    网络请求:用 Python 调用 API
  26. 26
    网页解析与合规采集
  27. 27
    操作 Excel、CSV 与批量文件正在阅读
  28. 28
    SQLite:给程序加一个数据库
  29. 29
    数据分析入门:NumPy 与 Pandas
  30. 30
    画图:把数据变得直观
  31. 31
    Flask 入门:做一个小网站
  32. 32
    异步编程:同时处理多项任务
  33. 33
    线程、进程与并发选择
  34. 34
    性能分析与优化
  35. 35
    项目结构、配置与发布
  36. 36
    综合项目:从需求到上线

查看整个系列 →

日常办公里最烦的事:一堆 Excel、CSV 文件要合并、清洗、重命名。手动操作又慢又容易错。这一篇教你用 Python 批量搞定这些——办公自动化的第一课

CSV:最通用的表格格式

CSV 之前简单提过,这里系统过一遍。用内置 csv 模块:

import csv

# 写:注意 newline="" 防止多余空行
with open("sales.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["日期", "商品", "金额"])
    writer.writerow(["2026-08-01", "苹果", 12.5])
    writer.writerow(["2026-08-02", "香蕉", 8.0])

# 读
with open("sales.csv", newline="", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)   # ['日期', '商品', '金额'] / ['2026-08-01', '苹果', '12.5'] ...

按列名操作更直观(DictReader/DictWriter):

import csv

# 读成字典列表
with open("sales.csv", newline="", encoding="utf-8") as f:
    rows = list(csv.DictReader(f))
print(rows[0]["商品"])     # 苹果

# 写(带表头)
with open("sales_out.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["日期", "商品", "金额"])
    writer.writeheader()
    writer.writerow({"日期": "2026-08-03", "商品": "橘子", "金额": 15.0})

Excel:openpyxl 操作 xlsx

真正的 .xlsx 文件用 openpyxl(先 pip install):

pip install openpyxl
from openpyxl import Workbook, load_workbook

# 创建新工作簿
wb = Workbook()
ws = wb.active                    # 默认工作表
ws.title = "销售数据"
ws.append(["日期", "商品", "金额"])    # 写一行(从 A1 开始)
ws.append(["2026-08-01", "苹果", 12.5])
ws.append(["2026-08-02", "香蕉", 8.0])
wb.save("sales.xlsx")

# 读取已有文件
wb2 = load_workbook("sales.xlsx")
ws2 = wb2.active
for row in ws2.iter_rows(values_only=True):   # 逐行取值
    print(row)
# ('日期', '商品', '金额')
# ('2026-08-01', '苹果', 12.5)
# ('2026-08-02', '香蕉', 8.0)

# 按单元格访问
print(ws2["A2"].value)    # 2026-08-01
print(ws2.cell(row=2, column=3).value)   # 12.5

改样式:加粗、列宽、颜色

from openpyxl import Workbook
from openpyxl.styles import Font, Alignment

wb = Workbook()
ws = wb.active

# 写表头 + 加粗
ws.append(["日期", "商品", "金额"])
for cell in ws[1]:                    # 第一行
    cell.font = Font(bold=True)

# 列宽
ws.column_dimensions["A"].width = 14
ws.column_dimensions["B"].width = 10
ws.column_dimensions["C"].width = 10

# 居中
for row in ws.iter_rows(min_row=1, max_row=3):
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

# 公式(Excel 公式直接写字符串)
ws["C4"] = "=SUM(C2:C3)"
wb.save("sales_styled.xlsx")

批量文件操作:glob + pathlib

处理一堆文件,用 glob 找文件、pathlib 操作路径:

from pathlib import Path
import glob

# 找所有 CSV
for path in glob.glob("data/*.csv"):
    print(path)

# 递归找(含子目录)
for path in glob.glob("data/**/*.csv", recursive=True):
    print(path)

# pathlib 更现代
data_dir = Path("data")
for p in data_dir.glob("*.csv"):      # 当前目录
    print(p.name)                     # 只有文件名
for p in data_dir.rglob("*.xlsx"):    # 递归
    print(p)

# 批量重命名:所有 report_*.csv → 2026_*.csv
for p in data_dir.glob("report_*.csv"):
    new_name = p.with_name(p.name.replace("report_", "2026_"))
    p.rename(new_name)
    print(f"{p.name} → {new_name.name}")

实战:合并多个 CSV 成一个 Excel

把 data 目录下所有 CSV 合并成一个带表头的 Excel:

import csv
from pathlib import Path
from openpyxl import Workbook

data_dir = Path("data")
wb = Workbook()
ws = wb.active
ws.title = "合并结果"

header_written = False
for csv_file in sorted(data_dir.glob("*.csv")):
    with open(csv_file, newline="", encoding="utf-8") as f:
        reader = csv.reader(f)
        for i, row in enumerate(reader):
            if i == 0 and header_written:   # 跳过后续文件的表头
                continue
            ws.append(row)
            if i == 0:
                header_written = True

wb.save("merged.xlsx")
print("合并完成:merged.xlsx")

这个小工具能直接用在真实工作上——把一堆日报、月报合并成一个总表。

数据量大时用 pandas

几十万行数据,openpyxl 会又慢又占内存。数据量大了直接用 pandas(数据分析那篇会细讲):

import pandas as pd

df = pd.read_csv("sales.csv")
print(df.head())            # 前 5 行
print(df["金额"].sum())     # 总金额
df.to_excel("sales_out.xlsx", index=False)   # 一行导出 Excel

记住这个方向:小数据用 csv/openpyxl,大数据用 pandas

新手坑

坑 1:CSV 中文乱码。Excel 打开 CSV 乱码时,写文件用 encoding="utf-8-sig"(带 BOM),Excel 就能正确识别。

坑 2:openpyxl 打不开 .xls。旧版 .xls 格式要用 xlrd/xlwt 或让用户另存为 .xlsx。

坑 3:覆盖原文件。保存前确认文件名,别把原始数据覆盖了。先存副本再操作。

小结

  • CSV:内置 csv 模块,DictReader/DictWriter 按列名操作
  • Excel:openpyxl,Workbook/load_workbook,append 写行、iter_rows 读行
  • 样式:Font(bold=True)、column_dimensions 列宽、Alignment 对齐、公式直接写
  • 批量文件:glob/pathlib 查找,rename 重命名
  • 大数据量上 pandas;中文 CSV 用 utf-8-sig 防乱码

练习

  1. 创建 3 个 CSV(模拟一周销售),写脚本合并成一个 Excel,并加一列”合计”公式
  2. 写脚本:把某个目录下所有 .txt 文件批量改名为 备份_原文件名
  3. 思考:为什么说”先备份再批量操作”是办公自动化的铁律?如果脚本有 bug 把 100 个文件重命名错了,没有备份会怎样?