使用 Pandas 的 to_excel() 方法来将多个 csv 文件合并到一个 xlsx 的不同 sheets 内

摘要:
修改后的核心代码如下:1#依赖openpyxl库2fromopenpyxlimportload_workbook34whileyear˂=2018:5csvPath=sys.path[0]+'/result/%d.csv'%year6excelPath=sys.path[0]+'/result.xlsx'7csvReader=pandas.read_csv8#增加engine='openpyxl'一栏9excelWriter=pandas.ExcelWriter10#使用openpyxl来把现有数据传递给excelWriter,使其在写入的时候保留原本数据11book=load_workbook12excelWriter.book=book1314print15csvReader.to_excel16excelWriter.save()如此存储的excel文件里就会有多个sheets了,每个sheets里都存储着一个csv里的全部数据。(也许直接使用excel的vba宏也是个不错的选择?

这几天在用 Python3 研究一个爬虫,最后一个需求是把爬下来的20+个csv文件整合到一个excel表里的不同sheets。

https://billc.io/wp-content/uploads/2019/04/image-3-1600x1175.png

初版的核心代码如下:

1 while year <= 2018:
2     csvPath = sys.path[0] + '/result/%d.csv' %year
3     excelPath = sys.path[0] + '/result.xlsx'
4     csvReader = pandas.read_csv(csvPath, encoding='utf_8_sig')
5     excelWriter =pandas.ExcelWriter(excelPath)
6     print("正在将 %d 年的 %d 条数据转换为 xlsx..." %(year, countThis))
7     csvReader.to_excel(excelWriter, sheet_name=str(year))
8     year = year + 1

奇怪的是使用这个方法,每次to_excel之后,result.xlsx中都只会存储一年的数据,只会存在一个sheet,之前的所有数据都会被覆盖。

通过查询官方文档(pandas.DataFrame.to_excel)和一个github上跨越了5年的issue(Allow ExcelWriter() to add sheets to existing workbook)得知pandas库的ExcelWriter缺失了一个mode='a'的append模式,所以在这种情况下每次to_excel()都会直接新建一个文件写入而无视之前的数据。

解决方案是使用openpyxl engine来打开ExcelWriter,用openpyxl的load_workbook方法将之前已经存在的数据加载进ExcelWriter.book里。修改后的核心代码如下:

1 #依赖 openpyxl 库
2 from openpyxl importload_workbook
3 
4 while year <= 2018:
5     csvPath = sys.path[0] + '/result/%d.csv' %year
6     excelPath = sys.path[0] + '/result.xlsx'
7     csvReader = pandas.read_csv(csvPath, encoding='utf_8_sig')
8     #增加 engine='openpyxl' 一栏
9     excelWriter = pandas.ExcelWriter(excelPath, engine='openpyxl'10     #使用 openpyxl 来把现有数据传递给excelWriter,使其在写入的时候保留原本数据
11     book =load_workbook(excelPath)
12     excelWriter.book =book
13 
14     print("正在将 %d 年的 %d 条数据转换为 xlsx..." %(year, countThis))
15     csvReader.to_excel(excelWriter, sheet_name=str(year))
16     excelWriter.save()

如此存储的excel文件里就会有多个sheets了,每个sheets里都存储着一个csv里的全部数据。

https://billc.io/wp-content/uploads/2019/04/image-5-1600x204.png

需要注意的是这样做的效率非常低,因为这并不是真正的追加模式,而是在每一次创建ExcelWriter对象之后,先将现有的数据全部传入ExcelWriter,再将新的数据连同旧的数据一同写入一个新的文件并覆盖。这就导致程序作了许多重复而无用的工作,所以我在处理这个任务的时候。最后的几个10+m的csv文件的平均耗时都在300s以上,如果还有后续任务的话,这个数字会一直增长下去。得到一个80m的xlsx总表耗费了接近一个小时的时间,这对于一些更大的任务来说是难以接受的。所以如果你需要处理的任务比较巨大,你可以脱离pandas库而使用xlrd和xlwt里的方法,会使运行效率优雅不少。(也许直接使用excel的vba宏也是个不错的选择?)

来源:https://billc.io/2019/04/pandas-append-excel/

免责声明:文章转载自《使用 Pandas 的 to_excel() 方法来将多个 csv 文件合并到一个 xlsx 的不同 sheets 内》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转) docker跨主机 macvlan 网络配置解决网站打开显示Service Unviable(应用程序池自动停止)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用C#读写结构化的二进制文件

最近工作上遇到一个问题,就是有将近200万个CSV文件,每个CSV文件包含了成千上万条实验数据,CSV以一个不连续的整数值作为文件名,比如:1.CSV、2.CSV、3.CSV、5.CSV等等。另外又有200万个XML文件,每个XML文件的文件名与CSV的文件名一一对应,在这些XML文件中,定义了所对应的CSV实验数据文件的实验描述信息(比如实验名称、实验类...

csv文件转换json文件

import java.io.*; import java.util.Arrays; import java.util.List; // CSV文件转 json文件 // 使用csvToJSon对象的.ConvertToJson方法 带入 csv文件路径及导出路径。 public class CSVToJSon { //cvs文件 pri...

Pandas数据分析 (一)

Series 和 DataFrame Pandas库基本运用   Series 包含一维索引的一组数据   DataFrame 包含 index 和 column 两个轴   Panel 一种三维数据容器 importpandas as pd importnumpy as np from pandas import Series, DataFrame...

Pandas学习(4、数据载入、存储及文件格式

importpandas as pd importnumpy as np '''4.1 文本格式数据的读写''' '''表:Pandas的解析函数 函数 描述 read_csv 从文件、URL或文件型对象读取分隔好的数据,逗号是默认分隔符 read_table 从文件、URL或文件型对象读取分隔好的数据,...

python数据分析——pandas的拼接操作

pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 1. 使用pd.concat()级联 pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数: objs axis=0 keys join='outer' /...

pandas dataframe.apply() 实现对某一行/列进行处理获得一个新行/新列

重点:dataframe.apply(function,axis)对一行或一列做出一些操作(axis=1则为对某一列进行操作,此时,apply函数每次将dataframe的一行传给function,然后获取返回值,将返回值放入一个series)python去空格:字符串.strip() 待解决:dataframe.assign()应该怎么用? (1)读入数...