Python脚本实现xls(xlsx)转成csv的方法与代码示例
本文详细介绍如何使用Python脚本将Excel文档批量转换为CSV格式。通过分别调用xlrd与openpyxl第三方库,提供命令行一键转换及按工作表自动拆分的两种完整代码实现,涵盖环境配置、参数传入与结果验证,适用于日常数据清洗与跨平台导入场景。
核心功能与环境准备
该脚本主要用于将Excel(xls/xlsx)格式的表格数据提取并写入逗号分隔值(CSV)文件。由于CSV原生不支持复杂格式与多个工作表,脚本会默认处理第一个工作表,或按表名拆分输出。使用前需确保系统中已安装Python环境。
方法一:基础逐行读取转换(基于xlrd)
此方案适合仅需导出单个Sheet内容到控制台的轻量场景。代码直接遍历表格行,将单元格统一转为带双引号的字符串并以逗号连接,便于后续管道重定向保存。
第1步:安装依赖库
打开终端或命令行窗口,执行以下命令安装解析Excel所需的第三方库:
pip install xlrd
目的:获取底层读写Excel二进制结构的接口。注意若需读取旧版.xls文件,建议锁定版本pip install "xlrd<2.0.0"。
第2步:执行转换命令并核对输出
创建脚本文件xls2csv.py,填入以下代码。运行后传入目标文件路径即可在终端查看CSV格式输出:
# -*- coding: utf-8 -*-
import xlrd
import sys
def read_excel(filename):
workbook = xlrd.open_workbook(filename)
sheet = workbook.sheet_by_index(0)
for row_idx in range(sheet.nrows):
rows = sheet.row_values(row_idx)
def _tostr(cell):
# 统一转为带引号字符串,防止含逗号时CSV解析错位
if isinstance(cell, str):
return '"%s"' % cell.encode('utf8') if hasattr(cell, 'encode') else '"%s"' % cell
else:
return '"%s"' % str(cell)
print(','.join([_tostr(cell) for cell in rows]))
if __name__ == '__main__':
if len(sys.argv) != 2:
print('用法: python xls2csv.py <xls或xlsx文件路径>')
sys.exit(1)
filename = sys.argv[1]
read_excel(filename)
操作入口:终端命令行。重要参数:sys.argv[1]接收文件绝对路径或相对路径。可观察的完成状态:终端逐行打印逗号分隔的内容,可通过> output.csv重定向保存为文件。
方法二:支持多Sheet拆分保存(基于openpyxl)
此方案适合需要保留所有工作表结构,且自动生成独立CSV文件的场景。利用openpyxl直接读取.xlsx结构,逐行写入磁盘,避免内存占用过高。
第1步:安装依赖库
pip install openpyxl
目的:获得对现代Office Open XML格式的只读接口。read_only=True参数可大幅降低大文件解析时的内存消耗。
第2步:运行脚本生成独立CSV文件
创建脚本文件xlsx2csv.py,填入以下代码。运行时脚本会自动计算文件名并输出至当前目录:
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
import csv
import os
import sys
def xlsx2csv(filename):
try:
wb = load_workbook(filename=filename, read_only=True, data_only=True)
for sheet_name in wb.sheetnames:
# 去除原文件名及表名中的空格,拼接新CSV名称
base_name = os.path.splitext(os.path.basename(filename.replace(' ', '_')))[0]
csv_filename = '{}_{}.csv'.format(base_name, sheet_name.replace(' ', '_'))
# 使用utf-8-sig编码写入BOM头,Excel可直接识别中文
csv_file = open(csv_filename, 'w', newline='', encoding='utf-8-sig')
csv_writer = csv.writer(csv_file)
sheet_ranges = wb[sheet_name]
for row in sheet_ranges.rows:
row_container = []
for cell in row:
val = cell.value
# 空值补空字符串,非ASCII文本保持原样,其余转字符串
if val is None:
row_container.append('')
elif isinstance(val, str) and ord(val) > 127:
row_container.append(val)
else:
row_container.append(str(val))
csv_writer.writerow(row_container)
csv_file.close()
print(f'已导出: {csv_filename}')
except Exception as e:
print('转换出错:', e)
if __name__ == '__main__':
if len(sys.argv) != 2:
print('用法: python xlsx2csv.py <xlsx文件路径>')
sys.exit(1)
xlsx2csv(sys.argv[1])
操作入口:终端命令行传入路径。重要参数:newline=''防止Windows下产生额外空行,encoding='utf-8-sig'解决记事本打开乱码。可观察的完成状态:终端打印各Sheet的CSV文件路径,同目录下出现对应命名文件。
常见问题排错与兼容性说明
- 中文乱码或显示为unicode转义:CSV标准未强制规定编码。方法一仅输出至终端,若需用记事本直接打开,推荐改用方法二的
utf-8-sig模式;或在Unix/Linux环境下追加管道| iconv -f UTF-8 -t GBK。 - 脚本提示找不到模块:确认Python版本与
pip路径一致。可使用python3 xls2csv.py test.xlsx显式指定解释器。 - 公式单元格输出结果为错误值:Excel公式保存后可能残留历史结果。两个脚本均已开启
data_only=True或直接读取底层值,确保导出的是计算后的最终数字或文本。
总结
以上提供了两套基于Python原生第三方库的Excel转CSV方案。针对简单导出需求,采用xlrd配合标准输出即可快速成型;针对企业级报表或多表拆分场景,使用openpyxl可实现更稳定的文件流式写入与编码兼容。掌握参数传递与编码处理要点,可有效避免数据截断与格式错乱。以上就是Python脚本实现xls(xlsx)转成csv的详细内容,更多关于Python数据处理与自动化办公的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









