Python 是一种解释型的, 动态数据类型的, 面向对象的高级程序设计语言. 拥有丰富的处理数据和文本类库, 并且得益于它是一种解释型的语言, 在程序修改和功能扩展上, 可以很容易做到大规模的调整. 综合考虑 Python 的动态, 轻量化特性, 使用 Python 来处理 Excel 自动生成 CSV 文档的操作. 程序的运行需要依赖两个 Python 的类库, Pandas 和 Xlrd.Pandas 是 Python 的一个数据分析类库. Xlrd 则是帮助开发人员从 Microsoft 的 Excel 操作数据的好帮手.
至于为什么要把 Excel 变成 CSV 就很简单了. 由于 CSV 基于 "," 符号切割字符串表单, 因此, 在程序上, 读写访问非常方便. 不需要导入厚重的 Excel 类库, 只需要基于 string 数据结构就可以实现基本的表单管理.
一.Python 和相关依赖库的配置步骤
1. 安装 Python
请到 Python 官网下载并安装 Python 运行时: https://www.python.org/downloads/
2. 安装成功后, 请打开 Cmd 控制台, 输入如下命令安装 Pandas
pip install pandas
3. 接着输入如下命令安装 Xlrd
pip install xlrd
4. 如果你使用 PyCharm, 那么该工程的引用库安装导入方式如下:
File -> Settings -> Project: [current project name] -> ProjectInterpreter -> +(Add Button) -> 弹出的搜索框里分别依次选中 Pandas 和 Xlrd.
二.转换实现
在开始编码前, 我们思考一下转换的流程:
先收集所有的 Excel 文件 -> 遍历每一个 Excel 文件 -> Excel 文件中还有众多的 Sheet 组成, 也要遍历他们 -> 最终把 Sheet 为单位生成独立的 CSV 文件
那么接下来就是要研究那些 API 可以帮忙我们, 如何获取目录文件集, 如何打开 excel 文档, 如何遍历 sheet, 如何保存成 csv 文档等等. 这里就不流水账罗列过程了, 直接贴出成品代码, 下面的代码是上述思考过程的最终成品. 最后, 我们启动 PyCharm 运行脚本, 显然当前脚本很好的搜索的指定的目录, 并把所有表格的 Sheet 生成对应的 CSV 文档.
对了, 代码里面我还留一个彩蛋, 如何遍历所有的表格单元. 这个, 可以很好的帮你处理非法的单元格数据, 关键的代码就是调用 dataframe 的 applymap 方法. 代码中示例输入的方法是 foreach_cell, 该方法的本体是将 nan 的数据变成 0.
另外, 你还会发现, 我用了 xlrd 获取 sheet 列表, 但是我又另外使用 pandas 打开对应 sheet. 我之所以这样做, 只是觉得 pandas 生成 csv 方便. 所以, 绕了点弯路. 但是无大碍, 一个转换代码而已, 起码能利用各个优点 (不是借口的借口吧).Pandas 有一个悲剧的地方就是不能获取 Excel 的 Sheet 总体情况, 不传入指定的 Sheet, 默认打开的是第一个 Sheet.
- import os
- import math
- import xlrd
- import pandas as pd
- def get_all_table_file_name(folder_path):
- table_names = []
- for file in os.listdir(folder_path):
- if os.path.splitext(file)[1] == '.xls' or os.path.splitext(file)[1] == '.xlsx':
- table_names.append(file)
- return table_names
- def foreach_cell(cell):
- if type(cell) is float and math.isnan(cell):
- cell = 0
- return cell
- def convert_table_to_csv(folder_path, file_name):
- file_path = folder_path + '/' + file_name
- print('开始转换 Excel 文档:' + file_path + '成 CSV 文档')
- tables = xlrd.open_workbook(file_path)
- print('..Sheet 总数:' + tables.nsheets.__str__())
- for sheet_table in tables.sheets():
- csv_file_name = file_name.replace('.xlsx', '')
- csv_file_name = csv_file_name.replace('.xls', '')
- output_path = 'output/' + csv_file_name + sheet_table.name + ".csv"
- sheet = pd.read_excel(file_path, sheet_table.name, index_col=None, index=False)
- sheet.columns = sheet.columns.str.replace('Unnamed.*', '')
- sheet.applymap(foreach_cell)
- sheet.to_csv(output_path, encoding='utf-8', index=False)
- print('.... 已经生成' + csv_file_name + sheet_table.name + 'CSV 文档')
- def convert_all_tables_to_csv(folder_paths):
- for folder_path in folder_paths:
- table_files = get_all_table_file_name(folder_path)
- for table_file in table_files:
- convert_table_to_csv(folder_path, table_file)
- scan_folders = ['.', 'tables']
- convert_all_tables_to_csv(scan_folders)
作者: 雨天
地址: http://www.cnblogs.com/HelloGalaxy/p/8863436.html
来源: https://www.cnblogs.com/HelloGalaxy/p/8863436.html