【问题标题】:Updating excel sheet with Pandas without overwriting the file使用 Pandas 更新 excel 表而不覆盖文件
【发布时间】:2020-02-24 20:18:54
【问题描述】:

我正在尝试使用 Python 代码更新 Excel 工作表。我阅读了特定的单元格并进行了相应的更新,但 Padadas 覆盖了整个 excelsheet,我丢失了其他页面以及格式。谁能告诉我如何避免它?

       Record = pd.read_excel("Myfile.xlsx", sheet_name'Sheet1', index_col=False)
       Record.loc[1, 'WORDS'] = int(self.New_Word_box.get())
       Record.loc[1, 'STATUS'] = self.Stat.get()
       Record.to_excel("Myfile.xlsx", sheet_name='Student_Data', index =False)

我的代码在上面,如您所见,我只想更新几个单元格,但它会覆盖整个 excel 文件。我试图寻找答案,但找不到任何具体的答案。

感谢您的帮助。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    更新:添加了更多说明

    步骤:

    1) 阅读需要在数据框中更改的工作表并在该数据框中进行更改。

    2) 现在更改会反映在数据框中,但不会反映在工作表中。将以下函数与步骤 1 中的数据框和要修改的工作表的名称一起使用。您将使用 truncate_sheet 参数来完全替换关注的工作表。 函数调用是这样的:

    append_df_to_excel(filename, df, sheet_name, startrow=0, truncate_sheet=True)
    
    from openpyxl import load_workbook
    import pandas as pd
    
    def append_df_to_excel(filename, df, sheet_name="Sheet1", startrow=None,
                           truncate_sheet=False,
                           **to_excel_kwargs):
        """
        Append a DataFrame [df] to existing Excel file [filename]
        into [sheet_name] Sheet.
        If [filename] doesn"t exist, then this function will create it.
    
        Parameters:
          filename : File path or existing ExcelWriter
                     (Example: "/path/to/file.xlsx")
          df : dataframe to save to workbook
          sheet_name : Name of sheet which will contain DataFrame.
                       (default: "Sheet1")
          startrow : upper left cell row to dump data frame.
                     Per default (startrow=None) calculate the last row
                     in the existing DF and write to the next row...
          truncate_sheet : truncate (remove and recreate) [sheet_name]
                           before writing DataFrame to Excel file
          to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
                            [can be dictionary]
    
        Returns: None
        """
        # ignore [engine] parameter if it was passed
        if "engine" in to_excel_kwargs:
            to_excel_kwargs.pop("engine")
    
        writer = pd.ExcelWriter(filename, engine="openpyxl")
    
        # Python 2.x: define [FileNotFoundError] exception if it doesn"t exist
        try:
            FileNotFoundError
        except NameError:
            FileNotFoundError = IOError
    
        if "index" not in to_excel_kwargs:
            to_excel_kwargs["index"] = False
    
        try:
            # try to open an existing workbook
            if "header" not in to_excel_kwargs:
                to_excel_kwargs["header"] = True
            writer.book = load_workbook(filename)
    
            # get the last row in the existing Excel sheet
            # if it was not specified explicitly
            if startrow is None and sheet_name in writer.book.sheetnames:
                startrow = writer.book[sheet_name].max_row
                to_excel_kwargs["header"] = False
    
            # truncate sheet
            if truncate_sheet and sheet_name in writer.book.sheetnames:
                # index of [sheet_name] sheet
                idx = writer.book.sheetnames.index(sheet_name)
                # remove [sheet_name]
                writer.book.remove(writer.book.worksheets[idx])
                # create an empty sheet [sheet_name] using old index
                writer.book.create_sheet(sheet_name, idx)
    
            # copy existing sheets
            writer.sheets = {ws.title: ws for ws in writer.book.worksheets}
        except FileNotFoundError:
            # file does not exist yet, we will create it
            to_excel_kwargs["header"] = True
    
        if startrow is None:
            startrow = 0
    
        # write out the new sheet
        df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
    
        # save the workbook
        writer.save()
    

    我们不能在这里替换 openpyxl 引擎来编写评论中要求的 excel 文件。参考参考2。

    参考资料:

    1) https://stackoverflow.com/a/38075046/6741053

    2) xlsxwriter: is there a way to open an existing worksheet in my workbook?

    【讨论】:

    • 谢谢,但它使用的是与 Pandas 不同的 openpyxl。我只想使用熊猫。有机会我只能使用 Pandas 吗?
    • 我不得不承认我迷路了。有 openpyxl 和 Pandas 的混合。例如 .save() 不是 pandas 函数,如果我使用 df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs),我会遇到同样的数据丢失问题。
    • .save() 是 excel writer 保存工作簿的函数,你不需要 df.to_excel 而是将 df 发送到上面的函数。
    • 再次感谢,但您能否详细说明您的声明“.save() 是 excel 编写器保存工作簿的功能,您不需要 df.to_excel 而是将 df 发送到上述功能”?如果我不需要 df.to_excel 并且 .save() 不是 pandas 函数,我该如何保存我的数据?
    • 该函数将为您执行此操作,它会执行这些操作,这样您的数据就不会丢失,并且只会更改您提供的工作表名称。其余工作表的数据将保持不变。稍后我会添加更多说明。
    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多