我的知识记录

Python Excel导出CSV格式 UTF-8带BOM

用pandas把Excel导出成CSV,解决中文乱码问题,使用utf-8-sig编码让Excel直接打开不乱码,支持导出单个sheet和多sheet分别导出。

Python Excel导出CSV格式

场景痛点

业务系统只接受CSV格式上传,但手里数据是xlsx;或者要把大表导入数据库,CSV更轻便。直接用Excel另存为CSV,中文经常变乱码。用Python导出时指定编码,一步到位。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def excel_to_csv(input_file, output_file, sheet_name=0):
"""把指定工作表导出成CSV"""
df = pd.read_excel(input_file, sheet_name=sheet_name)
# utf-8-sig 带BOM,Excel双击打开不会乱码
df.to_csv(output_file, index=False, encoding="utf-8-sig")
print(f"已导出: {output_file},{len(df)}行")

def excel_all_sheets_to_csv(input_file, output_dir):
"""把一个工作簿的每个工作表分别导出成CSV"""
import os
os.makedirs(output_dir, exist_ok=True)
xls = pd.ExcelFile(input_file)
for sheet in xls.sheet_names:
df = pd.read_excel(input_file, sheet_name=sheet)
out_path = os.path.join(output_dir, f"{sheet}.csv")
df.to_csv(out_path, index=False, encoding="utf-8-sig")
print(f"  [{sheet}] -> {out_path}")

if __name__ == "__main__":
# 单个sheet导出
excel_to_csv("./销售明细.xlsx", "./销售明细.csv")

# 多sheet分别导出
excel_all_sheets_to_csv("./多表数据.xlsx", "./csv输出目录")

代码讲解

  • df.to_csv(..., encoding="utf-8-sig")utf-8-sig 在文件头加BOM标记,Windows版Excel识别它是UTF-8,双击打开中文不乱码。
  • index=False 不写pandas自动生成的行号。
  • 多sheet导出处用 pd.ExcelFile 先拿到所有sheet名,逐个导出,文件名用sheet名。
  • 如需给数据库用,改用 encoding="utf-8"(不带BOM),BOM会让第一列列名前多个不可见字符。

运行结果

生成 .csv 文件,用Excel双击打开中文正常显示;多sheet版本在输出目录下每个sheet一个csv。

注意事项

  • CSV是纯文本,不保留公式、样式、多个sheet,导出前确认下游系统接受。
  • 字段里含逗号时pandas自动加引号包裹,下游解析一般没问题;但如果含换行符,某些老系统解析会出问题,先 str.replace("\n"," ")
  • 大表导出CSV比xlsx快很多,几十万行秒级完成。

Python Excel导出CSV格式 UTF-8带BOM

标签:

更新时间:2026-09-15 09:08:37

上一篇:Python Excel提取指定列到新表:按列名一键导出

下一篇:Python Excel删除行和列:delete_rows与delete_cols用法