文章目录
目录
- 前言
- 适用读者与目标
- 库选型与安装
- 读取 CSV(标准库 csv)
- 写入 CSV(标准库 csv)
- 使用 pandas 读写 CSV
- 编码与本地化要点(Windows/Excel 友好)
- 读取 Excel(.xlsx)
- 写入 Excel 与多工作表
- 样式、公式与格式(Excel)
- 类型、缺失值与前导零
- CSV ↔ Excel 转换
- 大文件与性能优化
- 常见坑点与规避
- 迷你速查
- 结语
面向数据分析、报表生成与系统集成的日常工作,CSV 与 Excel 几乎是最常用的两种表格数据格式。本文以实战为导向,系统讲解如何在 Python 中高效、稳健地读写 CSV 和 Excel,覆盖常见坑点与性能优化策略,并给出可直接复制使用的代码示例。
- 需要在后端或数据脚本中批量导入/导出表格数据
- 想提升对编码、空值、类型转换、性能的掌控
- 希望拥有一份可作为速查手册的实用指南
- 标准库:
csv 读写 CSV,无需安装。
- 主力库:
pandas 处理结构化数据,CSV/Excel 通吃。
- Excel 专用:
openpyxl 读写 .xlsx;xlsxwriter 适合写入时的样式与大文件优化。
csv 读写 CSV,无需安装。pandas 处理结构化数据,CSV/Excel 通吃。openpyxl 读写 .xlsx;xlsxwriter 适合写入时的样式与大文件优化。安装示例:
pip install pandas openpyxl xlsxwriter
import csv
from pathlib import Path
path = Path("data.csv")
with path.open("r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
pass
使用字典形式更便于字段访问:
import csv
from pathlib import Path
with Path("data.csv").open("r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for record in reader:
pass
import csv
from pathlib import Path
rows = [["id", "name", "score"], [1, "张三", 95]]
with Path("out.csv").open("w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
for row in rows:
writer.writerow(row)
写入带表头的字典:
import csv
from pathlib import Path
records = [
{"id": 1, "name": "张三", "score": 95},
{"id": 2, "name": "李四", "score": 88},
]
fieldnames = ["id", "name", "score"]
with Path("out_dict.csv").open("w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(records)
读取:
import pandas as pd
df = pd.read_csv("data.csv", encoding="utf-8")
写入:
df.to_csv("out.csv", index=False, encoding="utf-8")
逐块读取大文件:
import pandas as pd
for chunk in pd.read_csv("big.csv", chunksize=100_000):
pass
只读部分列并指定类型:
import pandas as pd
df = pd.read_csv(
"data.csv",
usecols=["id", "name", "score"],
dtype={"id": "Int64", "name": "string", "score": "float64"},
)
- Excel 偏好
UTF-8-SIG 或本地 ANSI。为兼容 Excel,写入 CSV 时可用 utf-8-sig。
- Windows 上换行符用
newline="" 交由 csv 控制,避免出现空行。
- 含中文数据建议统一使用
utf-8 或 utf-8-sig。
UTF-8-SIG 或本地 ANSI。为兼容 Excel,写入 CSV 时可用 utf-8-sig。newline="" 交由 csv 控制,避免出现空行。utf-8 或 utf-8-sig。示例:
import csv
from pathlib import Path
with Path("excel_friendly.csv").open("w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(["编号", "姓名", "备注"])
pandas 侧:
import pandas as pd
df = pd.DataFrame({"编号": [1, 2], "姓名": ["张三", "李四"]})
df.to_csv("excel_friendly.csv", index=False, encoding="utf-8-sig")
使用 pandas:
import pandas as pd
df = pd.read_excel("workbook.xlsx", sheet_name=0, engine="openpyxl")
指定列与类型:
import pandas as pd
df = pd.read_excel(
"workbook.xlsx",
sheet_name="Sheet1",
usecols=["id", "name", "score"],
dtype={"id": "Int64", "name": "string", "score": "float64"},
engine="openpyxl",
)
使用 openpyxl 原生读取:
from openpyxl import load_workbook
wb = load_workbook("workbook.xlsx", read_only=True)
ws = wb.active
for row in ws.iter_rows(values_only=True):
pass
wb.close()
pandas 写入多个工作表:
import pandas as pd
with pd.ExcelWriter("report.xlsx", engine="xlsxwriter") as writer:
df1 = pd.DataFrame({"id": [1, 2], "name": ["张三", "李四"]})
df2 = pd.DataFrame({"id": [3, 4], "name": ["王五", "赵六"]})
df1.to_excel(writer, sheet_name="用户A", index=False)
df2.to_excel(writer, sheet_name="用户B", index=False)
openpyxl 创建并写入:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "数据"
ws.append(["id", "name", "score"])
ws.append([1, "张三", 95])
wb.save("simple.xlsx")
使用 xlsxwriter 设置样式:
import pandas as pd
with pd.ExcelWriter("styled.xlsx", engine="xlsxwriter") as writer:
df = pd.DataFrame({"金额": [1234.5, 6789.01]})
df.to_excel(writer, sheet_name="Sheet1", index=False)
workbook = writer.book
worksheet = writer.sheets["Sheet1"]
fmt = workbook.add_format({"num_format": "#,##0.00", "bold": True})
worksheet.set_column("A:A", 12, fmt)
插入公式(openpyxl):
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
wb = Workbook()
ws = wb.active
ws.append(["单价", "数量", "总价"])
ws.append([10, 2, None])
ws["C2"] = "=A2*B2"
wb.save("formula.xlsx")
- 账单号、电话号码等标识码使用字符串类型,避免前导零丢失。
- pandas 读写时可指定
dtype=str 或使用 converters 保留格式。
- 缺失值处理可使用
na_filter=False 或 keep_default_na=False。
dtype=str 或使用 converters 保留格式。na_filter=False 或 keep_default_na=False。示例:
import pandas as pd
df = pd.read_csv(
"ids.csv",
dtype={"bill_no": "string", "phone": "string"},
keep_default_na=False,
)
CSV 转 Excel:
import pandas as pd
df = pd.read_csv("data.csv")
df.to_excel("data.xlsx", index=False)
Excel 转 CSV:
import pandas as pd
df = pd.read_excel("data.xlsx", engine="openpyxl")
df.to_csv("data.csv", index=False, encoding="utf-8")
多工作表合并读取:
import pandas as pd
xls = pd.ExcelFile("book.xlsx", engine="openpyxl")
frames = [xls.parse(name) for name in xls.sheet_names]
merged = pd.concat(frames, ignore_index=True)
- 流式读取:pandas
chunksize,openpyxl read_only=True 与 iter_rows。
- 避免不必要的类型推断与解析,显式传入
dtype、usecols。
- 写入 Excel 时使用
xlsxwriter,速度更优,内存占用更稳。
- pandas 2.x 可尝试
engine="pyarrow" 读取 CSV 以提升解析速度。
chunksize,openpyxl read_only=True 与 iter_rows。dtype、usecols。xlsxwriter,速度更优,内存占用更稳。engine="pyarrow" 读取 CSV 以提升解析速度。示例:
import pandas as pd
for chunk in pd.read_csv("big.csv", chunksize=200_000):
pass
openpyxl 写入大文件:
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet("数据")
for i in range(1_000_000):
ws.append([i, f"name_{i}"])
wb.save("big.xlsx")
- Excel 的最大行数约 1048576,超出需拆分或改用 CSV。
- Excel 可能将长数字自动格式化为科学计数法,读写时统一为字符串类型。
- CSV 分隔符可能不是逗号,注意使用
sep 或 delimiter。
- 字段中包含逗号或换行时需使用引号,pandas 自动处理,标准库需配置
quotechar。
- Windows 上若出现 CSV 空行,检查写入文件是否设置
newline=""。
sep 或 delimiter。quotechar。newline=""。
- 读 CSV:
pd.read_csv("file.csv")
- 写 CSV:
df.to_csv("file.csv", index=False)
- 读 Excel:
pd.read_excel("file.xlsx", engine="openpyxl")
- 写 Excel:
pd.ExcelWriter("file.xlsx", engine="xlsxwriter")
- 兼容 Excel 的 CSV 编码:
encoding="utf-8-sig"
- 大文件分块:
pd.read_csv(..., chunksize=...)
- 指定列与类型:
usecols=...、dtype=...
pd.read_csv("file.csv")df.to_csv("file.csv", index=False)pd.read_excel("file.xlsx", engine="openpyxl")pd.ExcelWriter("file.xlsx", engine="xlsxwriter")encoding="utf-8-sig"pd.read_csv(..., chunksize=...)usecols=...、dtype=...
掌握 CSV 与 Excel 的读写不仅是数据工程的基本功,更是提升系统集成与数据流转效率的关键。将本文的示例与策略纳入你的项目骨架,可以显著降低编码与格式问题带来的不确定性,并在大数据量场景下获得稳定的性能表现。
到此这篇关于Python自动化办公之处理CSV和Excel文件的操作指南的文章就介绍到这了,更多相关Python处理CSV和Excel内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 使用Python处理CSV文件的全面指南
- Python高效处理CSV、Excel和JSON数据的实战指南
- Python处理CSV文件与Excel文件的技巧分享
- Python利用pandas处理CSV文件的用法示例
- 使用Python自动化处理Excel表格的操作方法
- Python处理大量Excel文件的十个技巧分享
- 10个Python办公自动化案例总结