pandas 读取excel、一次性写入多个sheet、原有文件追加sheet

pandas 读取excel、一次性写入多个sheet、原有文件追加sheet

2020-03-07 12:14:17发布 浏览数:7923
概述:pandas 读取excel、一次性写入多个sheet、原有文件追加sheet

本文全部操作只需要引入pandas包即可

import pandas as pd
1

一、生成excel文件

首先构造pandas的DataFrame数据:

data = pd.DataFrame(
    {"col1":[1, 2, 3], 
     "col2":[4, 5, 6], 
     "col3":[7, 8, 9]
     }
    )
123456

数据如下:

In [01]:data
Out[01]: 
   col1  col2  col3
0     1     4     7
1     2     5     8
2     3     6     9
123456

这跟excel的行列展示极为相似。

然后就是使用pandas的to_excel方法生成excel文件并将该内容写入该excel文件:

data.to_excel("excel 样例.xlsx", index=False)
1

因为index的选项为False,所以没有将索引写入,结果如下:

同时还可以指定sheet名称、是否展示列名等其他操作,具体可见官网参数说明

二、读取excel文件

使用pandas 的read_excel方法

data = pd.read_excel("excel 样例.xlsx")
1

结果与上面创建的结果一样

In [01]:data
Out[01]: 
   col1  col2  col3
0     1     4     7
1     2     5     8
2     3     6     9
123456

这是最简单的读取excel,同样可以参考官网的参数说明来进行参数设置,指定sheet_name,表头等其他操作。

excel数据里经常会有数据说明、合并项等不需要读取或影响读取数据的单元格,比如下面的样例数据:

那么就要进行表头的设置、初始行的设置、sheet的选择:

data1 = pd.read_excel("excel 样例 1.xlsx", sheet_name="数据", header=2, usecols="B:E")
1

使用sheet_name参数指定sheet名称,使用header指定第2行为表头(从第0行开始),使用usecols指定列对应的位置,结果与上面的数据结果一致。

In [01]:data
Out[01]: 
   col1  col2  col3
0     1     4     7
1     2     5     8
2     3     6     9
123456

三、一次性插入多个sheet数据

将DataFrame数据写进excel文件中使用的还是文章开头的to_excel方法,但是需要添加引擎writer,如下所示:

data = pd.DataFrame(
    {"col1":[1, 2, 3], 
     "col2":[4, 5, 6], 
     "col3":[7, 8, 9]
     }
    )
writer = pd.ExcelWriter("excel 样例.xlsx")
data.to_excel(writer, sheet_name="这是第一个sheet")
data.to_excel(writer, sheet_name="这是第二个sheet")
data.to_excel(writer, sheet_name="这是第三个sheet")
writer.save()
writer.close()
123456789101112

使用pd.ExcelWriter生成writer,然后就可将数据写入该excel文件了,但是写完之后必须要writer.save()writer.close(),否则数据仍然只在数据流中,并没保存到excel文件中,或者使用with as 魔术方法,这样就会在数据写入完后自动保存并关闭句柄:

with pd.ExcelWriter("excel 样例.xlsx") as writer:
	data.to_excel(writer, sheet_name="这是第一个sheet")
	data.to_excel(writer, sheet_name="这是第二个sheet")
	data.to_excel(writer, sheet_name="这是第三个sheet")
1234

写入的结果如下:

注意此操作会将原文件内容覆盖掉,如想追加数据请看下章节

四、追加sheet内容

按照官网的示例使用writer = pd.ExcelWriter("excel 样例.xlsx", mode='a')就能插入sheet,而不是覆盖原文件,然而我进行该操作之后就报错了:

In [1]:writer = pd.ExcelWriter("excel 样例.xlsx", mode='a')
Traceback (most recent call last):

  File "<ipython-input-75-8f1e772ce767>", line 1, in <module>
    writer = pd.ExcelWriter("excel 样例.xlsx", mode='a')

  File "D:\anaconda\lib\site-packages\pandas\io\excel\_xlsxwriter.py", line 177, in __init__
    raise ValueError("Append mode is not supported with xlsxwriter!")

ValueError: Append mode is not supported with xlsxwriter!
12345678910

原因是现在常用的写入excel模块是openpyxl和xlsxwriter,pd.ExcelWriter方法默认是xlsxwriter,但是xlsxwriter不支持append操作,具体解释可以参考这篇博文。因此我们只需要更改模块就行:

data = pd.DataFrame(
       {"col1":[1, 2, 3], 
        "col2":[4, 5, 6], 
        "col3":[7, 8, 9]
        }
       )
with pd.ExcelWriter("excel 样例.xlsx", mode='a', engine='openpyxl') as writer:
       data.to_excel(writer, sheet_name="这是追加的第1个sheet")
       data.to_excel(writer, sheet_name="这是追加的第2个sheet")
    
12345678910

结果如下:


最后,还有个原sheet追加内容我没有写入,不写的原因是因为这样的需求太少了,如果实在是有这个需求我也可以通过读取该sheet内容然后使用pd.concat合并数据最后再写入。

请先
登录
后评论
0 条评论
暂时没有评论
最新文章
更多