python pandas read_excel engine=openpyxl 没有关闭文件

python pandas read_excel engine=openpyxl not closing file

我正在使用以下方法将数据帧加载到 pandas:

import pandas as pd

df_factor_histories=pd.read_excel("./eco_factor/eco_factor_test_data_builder.xlsx",
                                  engine='openpyxl', sheet_name=0)

engine=openpyxl 需要启用 read_excel 以支持更新的 Excel 文件格式(特别是在我的情况下 .xlsx 而不是 jusy .xls)。

数据框加载得很好但文件保持打开状态:

import psutil

p = psutil.Process()
print(p.open_files())

OUTPUT
[popenfile(path='C:\Users\xx\.ipython\profile_default\history.sqlite', fd=-1), 
popenfile(path='C:\Windows\System32\en-US\KernelBase.dll.mui', fd=-1), 
popenfile(path='C:\Windows\System32\en-US\kernel32.dll.mui', fd=-1), 
popenfile(path='D:\xxxxx\data modelling\eco_factor\eco_factor_test_data_builder.xlsx', fd=-1)]

Github Post 表明错误已修复 - 但对我来说不是 (运行 Anaconda/Jupyter)。 相关版本我是运行:

numpy                         1.19.2
openpyxl                      3.0.5
pandas                        1.1.3
Python 3.7.4

我希望能就如何关闭 files/best 解决此问题提出一些建议,谢谢

我建议从您的代码中删除 engine='openpyxl'。实际上并不需要。我在没有它的情况下使用 pd.read_excel,即使对于 .xlsx 格式也能正常工作。

删除它会导致引擎参数的默认行为接管。引擎将知道使用哪个引擎: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel

engine : str, default None
If io is not a buffer or path, this must be set to identify io. Supported engines: “xlrd”, “openpyxl”, “odf”, “pyxlsb”. Engine compatibility :

“xlrd” supports old-style Excel files (.xls).

“openpyxl” supports newer Excel file formats.

“odf” supports OpenDocument file formats (.odf, .ods, .odt).

“pyxlsb” supports Binary Excel files.

Changed in version 1.2.0: The engine xlrd now only supports old-style .xls files. When engine=None, the following logic will be used to determine the engine:

If path_or_buffer is an OpenDocument format (.odf, .ods, .odt), then odf will be used.

Otherwise if path_or_buffer is an xls format, xlrd will be used.

Otherwise if openpyxl is installed, then openpyxl will be used.

Otherwise if xlrd >= 2.0 is installed, a ValueError will be raised.

Otherwise xlrd will be used and a FutureWarning will be raised. This case will raise a ValueError in a future version of pandas.

我遇到了同样的问题,

当我使用 pandas 和 engine=openpyxl 读取 excel 文件时。它没有被关闭。当我尝试使用 python 存档/移动 excel 文件时,出现错误,

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process

此外,一旦它被 pandas 读取,我们就无法使用 Excel 工具对 excel 文件进行编辑或任何其他操作。

以下解决方案对我有用。 我正在使用:

python version 3.6.8.

pandas==0.25.1

openpyxl==3.0.7

import io
import pandas as pd

with open('path/to/input_excel_file.xlsx', "rb") as f:
    file_io_obj = io.BytesIO(f.read())


df_input_file = pd.read_excel(file_io_obj, engine='openpyxl', sheet_name=None)