追加到 Excel 时出现问题

Problems appending to Excel

提问人:Michael Bujard 提问时间:11/4/2023 最后编辑:Michael Bujard 更新时间:11/5/2023 访问量:28

问:

这可能是一个常见的问题,但我有一个使用 os 和 pandas 包的 Python 3.11.5 项目。

我需要读取和写入 Excel 文件。

目标是从 9 个源文件中读取。对于每个源文件,我都希望在源文件的列标题下获取数据。然后,我想将该数据迁移到目标文件的相应列。目标文件的第一行只是分析人员的信息。顺便说一句,该信息只是描述下一行中的标题。因此,第二行有标题。数据从目标 Excel 文件的第三行开始。目标 excel 文件最初没有数据。

对于每对源列标题“File NameX”和“File CategoryX”,我想获取其数据。

这里,X 是 1 到 26 之间的数字。恰好有 26 对标头名称中带有“文件名”和“文件类别”,所以这就是为什么 1 <= X <= 26。python 脚本从第 X 对获取数据后,我想用该数据填充第 X 个目标文件的相应列。对目标文件进行命名,以便将第 X 个目标文件称为“dest (X).xlsx .xlsx”。因此,X 是 1 到 26 之间的数字,来自“dest (X).xlsx .xlsx”的 X,也等于“文件名 X”和“文件类别 X”中的 X。源中的“文件名X”对应于目标中的“ITEM_DOCUMENT”,源中的“File CategoryX”对应于目标中的“ITEM_DOCUMENT_TYPE”。

问题:我的程序似乎覆盖了目标文件,而不是简单地将数据从源附加到目标文件的标题行下方。我说“似乎覆盖”是因为虽然保留了目标文件的标题,但格式不同(某些地方使用黑色粗体字体而不是红色粗体字体),第一行不再包含分析师的标题信息,宽度也不同。

如何简单地附加?我的代码 main 函数的一部分:

for i, (file_name_col, file_category_col) in \
                enumerate(zip(file_name_cols, file_category_cols), start=1):
                dest_file = os.path.join(dest_folder, f"dest ({i}).xlsx")

                # Check Column Existence:
                file_name_col = f'File Name{i}'
                file_category_col = f'File Category{i}'

                if file_name_col in source_data.columns and \
                    file_category_col in source_data.columns:
                    # Create destination DataFrame with specified headers if the file doesn't exist
                    if not os.path.isfile(dest_file):
                        dest_columns = ['PART_NUMBER', 'LANGUAGE_CODE', 'MANUFACTURER_NAME',
                                        'BRAND_NAME', 'ITEM_DOCUMENT', 'ITEM_DOCUMENT_TYPE']
                        dest_data = pd.DataFrame(columns=dest_columns)
                        dest_data.to_excel(dest_file, index=False)

                    # Read the existing destination data or
                    # create an empty DataFrame if the file doesn't exist
                    dest_data = pd.read_excel(dest_file, header=1) \
                        if os.path.isfile(dest_file) else pd.DataFrame()

                    dest_columns = ['PART_NUMBER', 'LANGUAGE_CODE', 'MANUFACTURER_NAME',
                                    'BRAND_NAME', 'ITEM_DOCUMENT', 'ITEM_DOCUMENT_TYPE']

                    # Ensure that the destination file has the required columns
                    for col in dest_columns:
                        if col not in dest_data.columns:
                            dest_data[col] = ''

                    new_data = source_data[['PART_NUMBER', 'LANGUAGE_CODE', \
                        'MANUFACTURER_NAME', 'BRAND_NAME']].copy()
                    new_data['ITEM_DOCUMENT'] = source_data[file_name_col].copy()
                    new_data['ITEM_DOCUMENT_TYPE'] = \
                        new_data['ITEM_DOCUMENT'].apply(determine_document_type)

                    # Append new data to the existing destination file
                    dest_data = pd.concat([dest_data, new_data], ignore_index=True)

                    # Write the combined data to the destination file
                    dest_data.to_excel(dest_file, index=False, sheet_name='Sheet1', engine='openpyxl')
                else:
                    # Handle the case where the columns don't exist
                    raise ValueError(f"Columns '{file_name_col}' \
                                    and/or '{file_category_col}' do not exist in source_data.")

我试过通过 ChatGPT 运行它,但它的想法已经用完了,并且一直忘记我已经尝试过的事情。请帮帮我。如果需要更多信息,我很乐意提供。我会在周末关注这篇文章——这是一个工作项目。任务自动化。尝试进行概念验证。谢谢,保重。

python-3.x pandas 附加 导出到 excel 数据迁移

评论

0赞 moken 11/4/2023
使用 ExcelWriter 并将模式设置为“a”(追加)。

答:

0赞 Michael Bujard 11/5/2023 #1

这真的是 moken 的答案,但是——替换了

dest_data = pd.concat([dest_data, new_data], ignore_index=True)

# Write the combined data to the destination file
dest_data.to_excel(dest_file, index=False, sheet_name='Sheet1', engine='openpyxl')

# Use ExcelWriter to append data to an existing file
with pd.ExcelWriter(dest_file, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
    # Write the new data to the destination file
    new_data.to_excel(writer, index=False, sheet_name='Sheet1', startrow=2, header=None)

并具有附加 Excel 工作表的预期结果,而不会覆盖标题。