Pandas:to_excel时如何不覆盖之前的Excel表、ExcelWriter类
如果只是想把一个DataFrame保存为单独的一个Excel文件,那么直接写:
data.to_excel('xxx.excel','sheet1',index=False)
但是这样做,只会保存为单个Excel文件和这个文件中的单个表。
如果先前存在有同名的Excel文件,这样做会把之前的Excel文件覆盖掉,不会起到在原文件中生成新的sheet的作用。
解决方法:
if not os.path.exists(mon_excel_path): data_write.to_excel(mon_excel_path, f'{mon}.{day}',encoding='GBK', header=['站点', '变化', '次数', '幅度/nt'], index=False) else: with pd.ExcelWriter(mon_excel_path, engine='openpyxl',mode='a') as writer: data_write.to_excel(writer,f'{mon}.{day}', header=['站点', '变化', '次数', '幅度/nt'], index=False)
上文各行代码的解释:
第一个if语句是在Excel文件不存在时,用于直接构建;
第二个if语句则是用ExcelWriter对已存在的Excel文件进行追加。
需要注意的是,如果Excel文件名含有中文,第一句的to_excel中的参数encoding需要写为'GBK',否则会导致追加时生成ExcelWriter异常,报错File is not a ZIP file。
补充
在Pandas 1.2.0版本之后(不含1.2.0),engine参数将弃用xlwt值,因此要使用xlwt引擎,请确保电脑上的pandas版本为1.2.0及以下,或者最好不使用xlwt。
下文是对ExcelWriter的补充说明,上文已经解决问题的可以不看下文。
ExcelWriter
pandas.ExcelWriter — pandas 1.3.3 documentation
构造
pd.ExcelWriter( path, engine=None, date_format=None, datetime_format=None, mode='w', storage_options=None, if_sheet_exists=None, engine_kwargs=None, **kwargs )
说明
这是一个用于把DataFrame对象写入Excel表的辅助类。
默认情况下,用xlwt来写xls,用openpyxl写入xlsx,用odf写入ods。如果想看一些更典型的用例,可以看DataFrame.to_excel
Writer构造时需要像打开文件那样进行上下文管理,也就是,使用with语句块的方式创建。不然的话就需要手动调用close()来关闭保存文件。
参数
参数 |
类型 |
默认值 |
说明 |
path | str | xls、xlsx、ods文件的路径 | |
engine | str | 引擎 | |
date_format | str | date写入Excel后的字符串格式('YYYY-MM-DD') | |
datetime_format | str | datetime写入Excel后的字符串格式('YYYY-MM-DD HH:MM:SS') | |
mode | {'w','a'} | 'w' | 写入模式,覆盖还是追加 |
storage_options | dict | ||
if_sheet_exists | {'error','new','replace'} | 'error' | 尝试写入一个已经存在的sheet时的响应方式:错误、新建、替换 |
engine_kwargs | dict | 传入引擎中的参数,从1.3.0才启用的 |
例子
1、构造一个DataFrame,写入xlsx中;
df = pd.DataFrame([["ABC", "XYZ"]], columns=["Foo", "Bar"]) with ExcelWriter("path_to_file.xlsx") as writer: df.to_excel(writer)
2、在同一个xlsx文件中,把两个DataFrame分别写入两个SHEET中;
df1 = pd.DataFrame([["AAA", "BBB"]], columns=["Spam", "Egg"]) df2 = pd.DataFrame([["ABC", "XYZ"]], columns=["Foo", "Bar"]) with ExcelWriter("path_to_file.xlsx") as writer: df1.to_excel(writer, sheet_name="Sheet1") df2.to_excel(writer, sheet_name="Sheet2")
3、设置date和datetime的格式;
from datetime import date, datetime df = pd.DataFrame( [ [date(2014, 1, 31), date(1999, 9, 24)], [datetime(1998, 5, 26, 23, 33, 4), datetime(2014, 2, 28, 13, 5, 13)], ], index=["Date", "Datetime"], columns=["X", "Y"], ) with ExcelWriter( "path_to_file.xlsx", date_format="YYYY-MM-DD", datetime_format="YYYY-MM-DD HH:MM:SS" ) as writer: df.to_excel(writer)
4、往已存在的Excel中追加;
with ExcelWriter("path_to_file.xlsx",mode='a',engine='openpyxl') as writer: df.to_excel(writer,sheet_name='Sheet3')