自学教程 学编程从这里开始

Pandas 数据导出

说明:本文是系列教程,汇总 Pandas 主流导出方案:CSV、Excel、Parquet、Feather、SQLite、JSON、HTML、Markdown,对比各自优缺点、参数、编码、坑点;前面教程已经单独讲过部分格式,本篇做统一汇总+实战导出策略。

1. 环境依赖

pip install pandas openpyxl xlsxwriter pyarrow
  • openpyxl:读写 .xlsx(推荐用于修改、追加sheet)
  • xlsxwriter:生成带格式、图表、条件格式的Excel
  • pyarrow:Parquet / Feather

2. 导出总览速查表

方法文件引擎优点缺点
df.to_csv().csv内置通用、体积小,所有软件打开丢失类型、日期变文本、中文乱码风险
df.to_excel().xlsxopenpyxl / xlsxwriter业务人员可读、多sheet大数据慢、文件体积大
df.to_parquet().parquetpyarrow列式压缩、类型保留、支持列裁剪不能直接用Office打开
df.to_feather().featherpyarrowDF交换速度最快生态弱,不适合长期归档
df.to_sql()SQLite/MySQLsqlalchemy支持查询、索引、追加需要数据库
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:索引作为key
  • split:适合程序解析,体积小

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. 超大数据集导出策略

  1. 超100万行,不要导出Excel:Excel单sheet上限,打开极卡,优先CSV / Parquet
  2. 超千万行: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)
  1. 给业务人员交付:优先CSV;给程序后续分析:Parquet

11. 常见报错 & 避坑清单

  1. Excel sheet名称不能超过31字符,不能包含 \ / : * ? [ ]
  2. 追加Excel mode="a" 只有 openpyxl 支持,xlsxwriter不支持
  3. NaN导出csv默认显示nan;业务报表一般设置 na_rep=""
  4. 日期导出csv会变成 2026-01-01 00:00:00,需要date_format截断
  5. JSON默认中文转unicode,一定要加 force_ascii=False
  6. Parquet不要保存index,浪费空间,index=False

12. 选型决策

  • 给运营/业务打开查看 → CSV(utf-8-sig)
  • 需要多sheet、简单排版 → Excel openpyxl
  • 程序后续继续分析、机器学习、大数据 → Parquet
  • Python脚本之间快速传递DF → Feather
  • 给前端接口 → JSON orient=”records”
  • 需要持久化查询、条件筛选 → SQLite / MySQL

0 条笔记