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快很多,几十万行秒级完成。

更新时间:2026-09-15 09:08:37
上一篇:Python Excel提取指定列到新表:按列名一键导出