我正在尝试将表写入一个 xlsx 文件。
# file path 'E:/file.xlsx'
file = Path(file_path)
# delete file if it exists
if file.is_file():
file.unlink()
print("File deleted")
# dfs ontains in dictionary
for key in dfs.keys():
# if file exists make ExcelWriter with mode 'append'
if file.is_file():
with pd.ExcelWriter(file_path, mode = 'a', if_sheet_exists='replace') as writer:
new_df = transform_df(dfs[key][0], dfs[key][1])
new_df.to_excel(writer, sheet_name=key, index=False)
print(f"{key} - sheet appended")
# if file not exists mode is 'write'
else:
with pd.ExcelWriter(file_path, mode = 'w') as writer:
new_df = transform_df(dfs[key][0], dfs[key][1])
new_df.to_excel(writer, sheet_name=key, index=False)
print("New file created")
writer.close()
大多数时候我可以使用此代码在文件中写入 dfs,但有时我会遇到错误然后尝试删除文件,因为文件仍然打开。
writer._save() 或 writer.close() 导致 ValueError: 对已关闭文件进行 I/O 操作。
文件是否自动关闭?
Pandas 诉“2.2.1”,openpyxl 诉“3.1.2”
它会自动关闭,因为您正在使用上下文管理器。
这是我添加的链接中的示例:
with open('some_file', 'w') as opened_file:
opened_file.write('Hola!')
相当于:
file = open('some_file', 'w')
try:
file.write('Hola!')
finally:
file.close()
因此请记住这一点,当
with
块完成时,您已经关闭了文件。
with pd.ExcelWriter(file_path, mode = 'w') as writer:
new_df = transform_df(dfs[key][0], dfs[key][1])
new_df.to_excel(writer, sheet_name=key, index=False)
print("New file created")
这样你就可以删除这一行
writer.close()
应该没问题。