说明:本文是系列教程,汇总 Pandas 主流导出方案:CSV、Excel、Parquet、Feather、SQLite、JSON、HTML、Markdown,对比各自优缺点、参数、编码、坑点;前面教程已经单独讲过部分格式,本篇做统一汇总+实战导出策略。
1. 环境依赖
pip install pandas openpyxl xlsxwriter pyarrow
openpyxl:读写.xlsx(推荐用于修改、追加sheet)xlsxwriter:生成带格式、图表、条件格式的Excelpyarrow:Parquet / Feather
2. 导出总览速查表
| 方法 | 文件 | 引擎 | 优点 | 缺点 |
|---|---|---|---|---|
df.to_csv() | .csv | 内置 | 通用、体积小,所有软件打开 | 丢失类型、日期变文本、中文乱码风险 |
df.to_excel() | .xlsx | openpyxl / xlsxwriter | 业务人员可读、多sheet | 大数据慢、文件体积大 |
df.to_parquet() | .parquet | pyarrow | 列式压缩、类型保留、支持列裁剪 | 不能直接用Office打开 |
df.to_feather() | .feather | pyarrow | DF交换速度最快 | 生态弱,不适合长期归档 |
df.to_sql() | SQLite/MySQL | sqlalchemy | 支持查询、索引、追加 | 需要数据库 |
df.to_json() | .json | 内置 | 对接前端、接口 | 不适合超大表格 |
df.to_html() | .html | 内置 | 网页展示 | 仅静态表格 |
df.to_markdown() | md文本 | 内置 | 文档、笔记、README | 仅文本展示 |
统一约定:绝大多数业务场景
index=False,不导出pandas行索引
3. CSV 导出 to_csv
import pandas as pd
df = pd.DataFrame({
"id": [1,2,3],
"name": ["张三","李四","王五"],
"amount": [100.5,200.0,350.2],
"dt": pd.date_range("2026-01-01", periods=3)
})
# 标准推荐写法,解决中文乱码
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
常用参数:
df.to_csv(
"output.csv",
index=False,
encoding="utf-8-sig",
sep=",", # 分隔符,也可以用 \t 制表符
na_rep="", # NaN 导出为空字符串,默认是nan
float_format="%.2f", # 浮点数保留2位小数
date_format="%Y-%m-%d"
)
坑:
utf-8直接导出Excel打开中文乱码;utf-8-sig 是给Windows Excel用的。
4. Excel 导出 to_excel
单sheet
df.to_excel("output.xlsx", index=False, engine="openpyxl")
多Sheet(重点,高频需求)
with pd.ExcelWriter("multi_sheet.xlsx", engine="openpyxl") as writer:
df1.to_excel(writer, sheet_name="订单", index=False)
df2.to_excel(writer, sheet_name="客户", index=False)
引擎选择:
openpyxl:支持读+写,支持追加已有文件xlsxwriter:只写,支持条件格式、冻结窗格、图表(前面进阶Excel教程配套)
追加到已有Excel文件:
with pd.ExcelWriter("multi_sheet.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
df.to_excel(writer, sheet_name="订单", index=False)
if_sheet_exists 可选:replace / new / overlay
5. Parquet / Feather 二进制导出
# Parquet
df.to_parquet("output.parquet", engine="pyarrow", compression="snappy", index=False)
# Feather
df.to_feather("output.feather", compression="zstd")
参数回顾:
snappy:平衡速度压缩,默认首选gzip:压缩率更高,慢- 优势:自动保留 dtype,日期、数字不会变成字符串
6. JSON 导出 to_json
# 默认 records 格式,数组对象,最适合前端
df.to_json("output.json", orient="records", force_ascii=False)
orient 常用取值:
records:[{"id":1,"name":"张三"},...]✅ 前端最常用columns:按列组织index:索引作为keysplit:适合程序解析,体积小
force_ascii=False:中文不转\uXXXX编码
7. HTML / Markdown 导出
# 导出HTML表格字符串
html_table = df.to_html(index=False, border=1)
with open("table.html", "w", encoding="utf-8") as f:
f.write(html_table)
# Markdown 表格(需要 tabulate)
# pip install tabulate
md_table = df.to_markdown(index=False)
print(md_table)
with open("table.md", "w", encoding="utf-8") as f:
f.write(md_table)
8. 数据库导出 to_sql
from sqlalchemy import create_engine
engine = create_engine("sqlite:///output.db")
df.to_sql(
"order_table",
con=engine,
if_exists="replace", # replace / append / fail
index=False,
chunksize=1000
)
大数据分批写入用 chunksize,防止内存爆掉
9. 导出时统一清洗处理(通用模板)
导出前标准化,避免各种格式坑:
# 空值处理
df = df.fillna("")
# 日期格式化
df["dt"] = df["dt"].dt.strftime("%Y-%m-%d %H:%M:%S")
# 浮点数精度
df["amount"] = df["amount"].round(2)
# 去除前后空格
df["name"] = df["name"].str.strip()
# 导出
df.to_csv("clean.csv", index=False, encoding="utf-8-sig")
10. 超大数据集导出策略
- 超100万行,不要导出Excel:Excel单sheet上限,打开极卡,优先CSV / Parquet
- 超千万行:Parquet 分区导出,或者分批写入csv
# 分批导出示例
chunk_size = 20000
for i, chunk in enumerate(pd.read_csv("big.csv", chunksize=chunk_size)):
chunk.to_parquet(f"part_{i}.parquet", index=False)
- 给业务人员交付:优先CSV;给程序后续分析:Parquet
11. 常见报错 & 避坑清单
- Excel sheet名称不能超过31字符,不能包含
\ / : * ? [ ] - 追加Excel
mode="a"只有 openpyxl 支持,xlsxwriter不支持 - NaN导出csv默认显示nan;业务报表一般设置
na_rep="" - 日期导出csv会变成
2026-01-01 00:00:00,需要date_format截断 - JSON默认中文转unicode,一定要加
force_ascii=False - Parquet不要保存index,浪费空间,
index=False
12. 选型决策
- 给运营/业务打开查看 → CSV(utf-8-sig)
- 需要多sheet、简单排版 → Excel openpyxl
- 程序后续继续分析、机器学习、大数据 → Parquet
- Python脚本之间快速传递DF → Feather
- 给前端接口 → JSON orient=”records”
- 需要持久化查询、条件筛选 → SQLite / MySQL
0 条笔记