我的知识记录

Python CSV批量转Excel文件

用pandas批量读取文件夹下所有CSV,自动识别GBK/UTF-8编码,合并或转成xlsx格式,解决CSV双击乱码和批量转换问题。

Python CSV批量转Excel

场景痛点

系统导出一堆CSV文件,同事说打不开乱码,或者要统一转成xlsx格式方便发出去。一个个打开另存太慢,编码不对还全是问号。Python批量处理,自动试编码,一步到位。

用到的库

pip install pandas openpyxl

完整代码

import os
import pandas as pd

def read_csv_auto_encoding(path):
"""自动尝试常见编码读取CSV"""
for enc in ["utf-8-sig", "utf-8", "gbk", "gb18030"]:
try:
return pd.read_csv(path, encoding=enc)
except (UnicodeDecodeError, UnicodeError):
continue
raise ValueError(f"无法识别编码: {path}")

def csv_to_excel_one(csv_path, output_path):
"""单个CSV转Excel"""
df = read_csv_auto_encoding(csv_path)
df.to_excel(output_path, index=False)
print(f"{csv_path} -> {output_path},{len(df)}行")

def csv_batch_to_excel(input_dir, output_dir):
"""批量把目录下所有CSV转成xlsx"""
os.makedirs(output_dir, exist_ok=True)
csv_files = [f for f in os.listdir(input_dir) if f.lower().endswith(".csv")]
for csv_file in csv_files:
csv_path = os.path.join(input_dir, csv_file)
xlsx_name = os.path.splitext(csv_file)[0] + ".xlsx"
xlsx_path = os.path.join(output_dir, xlsx_name)
try:
csv_to_excel_one(csv_path, xlsx_path)
except Exception as e:
print(f"失败: {csv_file},原因: {e}")

def csv_batch_merge_to_one_excel(input_dir, output_file):
"""把所有CSV合并成一个Excel"""
df_list = []
for f in os.listdir(input_dir):
if f.lower().endswith(".csv"):
df = read_csv_auto_encoding(os.path.join(input_dir, f))
df["来源文件"] = f
df_list.append(df)
result = pd.concat(df_list, ignore_index=True, sort=False)
result.to_excel(output_file, index=False)
print(f"合并完成,共{len(result)}行 -> {output_file}")

if __name__ == "__main__":
# 每个CSV一个xlsx
csv_batch_to_excel("./csv输入", "./xlsx输出")
# 所有CSV合并成一个
csv_batch_merge_to_one_excel("./csv输入", "./合并结果.xlsx")

代码讲解

  • read_csv_auto_encoding 依次尝试 utf-8-sigutf-8gbkgb18030 四种编码,哪个不抛异常就用哪个,解决乱码。
  • os.path.splitext.csv 后缀替换成 .xlsx,保持文件名一致。
  • 批量合并版用 pd.concat 把多个CSV纵向拼起来,加"来源文件"列追溯。
  • try/except 让单个文件失败不影响整体。

运行结果

批量转换版在输出目录下每个csv对应一个xlsx;合并版生成一个总的xlsx,控制台打印每个文件行数。

注意事项

  • CSV没有工作表概念,转出来只有一个sheet。
  • 日期、数字在CSV里都是字符串,转xlsx后如需计算,要用 pd.to_datetimepd.to_numeric 转类型。
  • 文件很大时读CSV比读xlsx快很多,反而是写xlsx慢,大批量转换给点耐心。

Python CSV批量转Excel文件

标签:

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

上一篇:Python Excel添加边框样式:细线粗线内外框一键设置

下一篇: