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')

 

posted @ 2021-06-09 16:09  ShineLe  阅读(11766)  评论(0编辑  收藏  举报