系列文章
Python 从入门到精通
第 27 / 36 篇
从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。
-
01
Python 怎么装、怎么用 -
02
变量、数字和字符串 -
03
列表:把一组数据放在一起 -
04
元组、集合和字典 -
05
条件判断:让程序做选择 -
06
循环:重复的事交给程序 -
07
函数:把代码整理成可复用的块 -
08
模块与包:拆分你的程序 -
09
输入、输出与字符串格式化 -
10
文件读写:保存程序的数据 -
11
异常处理:程序出错时怎么办 -
12
基础阶段练习:命令行记账本 -
13
类和对象:面向对象入门 -
14
继承、组合与特殊方法 -
15
迭代器与生成器 -
16
列表推导式与生成器表达式 -
17
装饰器:给函数增加能力 -
18
上下文管理器与 with -
19
类型标注与 dataclass -
20
正则表达式:从文本中找规律 -
21
日期、时间与时区 -
22
日志与调试 -
23
虚拟环境与依赖管理 -
24
测试:让修改不再提心吊胆 -
25
网络请求:用 Python 调用 API -
26
网页解析与合规采集 -
27
操作 Excel、CSV 与批量文件正在阅读 -
28
SQLite:给程序加一个数据库 -
29
数据分析入门:NumPy 与 Pandas -
30
画图:把数据变得直观 -
31
Flask 入门:做一个小网站 -
32
异步编程:同时处理多项任务 -
33
线程、进程与并发选择 -
34
性能分析与优化 -
35
项目结构、配置与发布 -
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 防乱码
练习
- 创建 3 个 CSV(模拟一周销售),写脚本合并成一个 Excel,并加一列”合计”公式
- 写脚本:把某个目录下所有 .txt 文件批量改名为
备份_原文件名 - 思考:为什么说”先备份再批量操作”是办公自动化的铁律?如果脚本有 bug 把 100 个文件重命名错了,没有备份会怎样?