提问人:Michael Bujard 提问时间:11/4/2023 最后编辑:Michael Bujard 更新时间:11/5/2023 访问量:28
追加到 Excel 时出现问题
Problems appending to Excel
问:
这可能是一个常见的问题,但我有一个使用 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 运行它,但它的想法已经用完了,并且一直忘记我已经尝试过的事情。请帮帮我。如果需要更多信息,我很乐意提供。我会在周末关注这篇文章——这是一个工作项目。任务自动化。尝试进行概念验证。谢谢,保重。
答:
这真的是 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 工作表的预期结果,而不会覆盖标题。
评论