日常数据处理中,经常遇到需要把一批 csv 文件汇总到一个 excel 工作簿的场景——每个 csv 对应一个工作表,方便统一查看和分发。python 原生 csv 模块可以读取数据,但要逐个写入 excel 的不同工作表,还需要额外的写入逻辑。使用 free spire.xls for python 免费库可以直接将 csv 加载为工作簿对象,再将其工作表复制到目标工作簿中,代码量很少。
环境准备
通过 pip 安装免费版本即可,支持 python 3.6+ 以及 windows、macos、linux:
pip install spire.xls.free
free spire.xls for python 无需安装 microsoft excel,在服务器或无桌面环境中也能运行。需要注意,免费版对 .xls 格式的读写有工作表数量限制(每个工作簿最多 5 个,每个工作表最多 200 行);如果输出为 .xlsx 格式,则不触发这一限制。对于工作表数量较多或行数较大的场景,建议输出 .xlsx。
核心思路
单个 csv 文件用 workbook.loadfromfile() 加载后,数据会出现在工作簿的第一个工作表(索引 0)中。要合并多个 csv,可以:
- 创建一个目标
workbook; - 遍历 csv 文件列表,每个文件单独加载;
- 用
worksheets.addcopy()将其工作表复制到目标工作簿; - 重命名复制过来的工作表,便于区分;
- 保存目标工作簿为
.xlsx。
addcopy 方法会连同数据、格式一并复制,第二个参数 worksheetcopytype.copyall 可确保完整性。
完整代码
以下脚本将指定目录下所有 csv 文件合并到一个 excel 文件中,每个 csv 对应一个工作表:
import os
import glob
from spire.xls import *
from spire.xls.common import *
def merge_csv_to_excel(csv_dir, output_path, delimiter=","):
"""
将目录下的所有 csv 文件合并到一个 excel 文件中。
每个 csv 对应一个工作表,工作表名取自文件名(不含扩展名)。
参数:
csv_dir: csv 文件所在目录
output_path: 输出 excel 文件路径(建议 .xlsx)
delimiter: csv 分隔符,默认逗号
"""
csv_files = glob.glob(os.path.join(csv_dir, "*.csv"))
if not csv_files:
print("未找到 csv 文件")
return
# 创建目标工作簿
target_book = workbook()
# 删除默认生成的空白工作表(保留一个作为占位,后续按需删除)
# 这里先不删,处理完第一个文件后再统一处理
for idx, file_path in enumerate(csv_files):
file_name = os.path.splitext(os.path.basename(file_path))[0]
# 加载单个 csv 文件
source_book = workbook()
source_book.loadfromfile(file_path, delimiter, 1, 1)
# 获取 csv 解析后的工作表
source_sheet = source_book.worksheets[0]
# 复制到目标工作簿
target_book.worksheets.addcopy(source_sheet, worksheetcopytype.copyall)
# 重命名新复制的工作表
new_sheet = target_book.worksheets[target_book.worksheets.count - 1]
new_sheet.name = file_name[:31] # excel 工作表名最长 31 个字符
source_book.dispose()
print(f"已导入: {file_name}")
# 删除目标工作簿中最初的空白工作表
# 默认 workbook() 会创建 3 个工作表,删除未使用的
for i in range(target_book.worksheets.count - 1, -1, -1):
sheet = target_book.worksheets[i]
# 如果工作表名仍是默认的 sheet1/sheet2/sheet3,且不在已导入的列表中
if sheet.name in ["sheet1", "sheet2", "sheet3"]:
target_book.worksheets.removeat(i)
# 保存为 xlsx
target_book.savetofile(output_path, fileformat.version2016)
target_book.dispose()
print(f"\n合并完成: {output_path}")
if __name__ == "__main__":
merge_csv_to_excel(
csv_dir="./csv_files",
output_path="./merged_output.xlsx",
delimiter=","
)
几个关键点
- loadfromfile 的参数。
loadfromfile(filename, separator, startrow, startcolumn)中,separator指定分隔符,不限于逗号。如果处理的是制表符分隔的 tsv,传入"\t"即可;分号分隔的欧洲数据文件传入";"。 - 工作表命名。 excel 工作表名最长 31 个字符,且不能包含
\ / ? * [ ] :等字符。上面的代码用file_name[:31]做了截断,如果实际文件名中包含特殊字符,建议再做一次替换处理。 - 删除默认工作表。
workbook()初始化时会自动创建 3 个空白工作表。上面的代码在导入完成后遍历删除名称为sheet1/sheet2/sheet3的工作表,但要注意如果 csv 文件名恰好也叫sheet1.csv,会产生误删。更稳妥的做法是在创建目标工作簿后立即清空默认工作表:
target_book = workbook()
while target_book.worksheets.count > 0:
target_book.worksheets.removeat(0)
这样 addcopy 添加的工作表从第一个开始,逻辑更干净。但需要注意,如果删除所有工作表后直接 addcopy,部分版本可能报错,此时可以先保留一个再替换。根据实际库版本调整即可。
- 非 utf-8 编码的 csv。 如果 csv 文件使用 gbk 等编码,
loadfromfile可能无法正确解析中文。这种情况下可以先用 python 的csv模块读取并转码为临时文件,再交给 spire.xls 加载,或者确认该库当前版本是否支持通过参数指定编码。
这个脚本适合轻量自动化场景,把零散 csv 归集到一个 excel 工作簿,每个文件单独一个 sheet。free spire.xls for python 的优势在于脱离 office 环境运行,csv 导入 api 封装简洁,不需要手动逐行读写单元格。
到此这篇关于利用python脚本把文件夹里的csv批量导入excel的完整代码的文章就介绍到这了,更多相关python文件夹csv批量导入excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论