From ff1826b14f613ea277ea3683d6b3a6b86f3a85b3 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Sat, 2 Mar 2024 15:10:44 -0500 Subject: [PATCH] REF: Avoid importing xlrd --- pandas/io/excel/_base.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 8a287beac7afd..c38ced573531e 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -43,6 +43,7 @@ from pandas.core.dtypes.common import ( is_bool, + is_file_like, is_float, is_integer, is_list_like, @@ -1523,20 +1524,25 @@ def __init__( # Always a string self._io = stringify_path(path_or_buffer) - # Determine xlrd version if installed - if import_optional_dependency("xlrd", errors="ignore") is None: - xlrd_version = None - else: - import xlrd - - xlrd_version = Version(get_version(xlrd)) - if engine is None: # Only determine ext if it is needed - ext: str | None - if xlrd_version is not None and isinstance(path_or_buffer, xlrd.Book): - ext = "xls" - else: + ext: str | None = None + + if not isinstance( + path_or_buffer, (str, os.PathLike, ExcelFile) + ) and not is_file_like(path_or_buffer): + # GH#56692 - avoid importing xlrd if possible + if import_optional_dependency("xlrd", errors="ignore") is None: + xlrd_version = None + else: + import xlrd + + xlrd_version = Version(get_version(xlrd)) + + if xlrd_version is not None and isinstance(path_or_buffer, xlrd.Book): + ext = "xls" + + if ext is None: ext = inspect_excel_format( content_or_path=path_or_buffer, storage_options=storage_options )