Skip to content

Commit 45a628c

Browse files
authored
read_excel accepts PathLike, buffers (#195)
* read_excel accepts PathLike, buffers pandas.read_excel is documented to accept > str, bytes, ExcelFile, xlrd.Book, path object, or file-like object This expands the annotation to include str, bytes, paths, and file-likes. Bytes are coerced into a BytesIO inside ExcelReader. * Exercise Excel IO using new types * blacken * Review feedback * Add breadcrumb * Close file before reopening * Remove try/except
1 parent 44e3f17 commit 45a628c

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

pandas-stubs/io/excel/_base.pyi

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ from pandas.core.frame import DataFrame
1010

1111
from pandas._typing import (
1212
Dtype,
13+
FilePath,
14+
ReadBuffer,
1315
Scalar,
1416
)
1517

1618
@overload
1719
def read_excel(
18-
filepath: str,
20+
filepath: FilePath | ReadBuffer[bytes] | bytes,
1921
sheet_name: list[int | str] | None,
2022
header: int | Sequence[int] | None = ...,
2123
names: list[str] | None = ...,
@@ -42,7 +44,7 @@ def read_excel(
4244
) -> dict[int | str, DataFrame]: ...
4345
@overload
4446
def read_excel(
45-
filepath: str,
47+
filepath: FilePath | ReadBuffer[bytes] | bytes,
4648
sheet_name: int | str = ...,
4749
header: int | Sequence[int] | None = ...,
4850
names: list[str] | None = ...,

tests/test_frame.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,27 @@ def test_read_excel() -> None:
12711271
df17: dict[int | str, pd.DataFrame] = pd.read_excel("foo", sheet_name=None)
12721272

12731273

1274+
def test_read_excel_io_types() -> None:
1275+
# GH 195
1276+
df = pd.DataFrame([[1, 2], [8, 9]], columns=["A", "B"])
1277+
with tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx") as file:
1278+
as_str: str = file.name
1279+
df.to_excel(file)
1280+
1281+
check(assert_type(pd.read_excel(as_str), pd.DataFrame), pd.DataFrame)
1282+
1283+
as_path = Path(as_str)
1284+
check(assert_type(pd.read_excel(as_path), pd.DataFrame), pd.DataFrame)
1285+
1286+
with as_path.open("rb") as as_file:
1287+
check(assert_type(pd.read_excel(as_file), pd.DataFrame), pd.DataFrame)
1288+
1289+
as_bytes = as_path.read_bytes()
1290+
check(assert_type(pd.read_excel(as_bytes), pd.DataFrame), pd.DataFrame)
1291+
1292+
Path(as_str).unlink()
1293+
1294+
12741295
def test_join() -> None:
12751296
float_frame = pd.DataFrame(getSeriesData())
12761297
# GH 29

0 commit comments

Comments
 (0)