Skip to content

Commit ec4609e

Browse files
deflatSOCOjreback
authored andcommitted
DEPR: deprecated sheetname from ExcelFile.parse (#20938)
1 parent 28dbae9 commit ec4609e

File tree

3 files changed

+34
-18
lines changed

3 files changed

+34
-18
lines changed

doc/source/whatsnew/v0.23.0.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,7 @@ Deprecations
975975
retain the previous behavior, use a list instead of a tuple (:issue:`18314`)
976976
- ``Series.valid`` is deprecated. Use :meth:`Series.dropna` instead (:issue:`18800`).
977977
- :func:`read_excel` has deprecated the ``skip_footer`` parameter. Use ``skipfooter`` instead (:issue:`18836`)
978+
- :meth:`ExcelFile.parse` has deprecated ``sheetname`` in favor of ``sheet_name`` for consistency with :func:`read_excel` (:issue:`20920`).
978979
- The ``is_copy`` attribute is deprecated and will be removed in a future version (:issue:`18801`).
979980
- ``IntervalIndex.from_intervals`` is deprecated in favor of the :class:`IntervalIndex` constructor (:issue:`19263`)
980981
- ``DataFrame.from_items`` is deprecated. Use :func:`DataFrame.from_dict` instead, or ``DataFrame.from_dict(OrderedDict())`` if you wish to preserve the key order (:issue:`17320`, :issue:`17312`)

pandas/io/excel.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -303,20 +303,11 @@ def read_excel(io,
303303
convert_float=True,
304304
**kwds):
305305

306-
# Can't use _deprecate_kwarg since sheetname=None has a special meaning
307-
if is_integer(sheet_name) and sheet_name == 0 and 'sheetname' in kwds:
308-
warnings.warn("The `sheetname` keyword is deprecated, use "
309-
"`sheet_name` instead", FutureWarning, stacklevel=2)
310-
sheet_name = kwds.pop("sheetname")
311-
elif 'sheetname' in kwds:
312-
raise TypeError("Cannot specify both `sheet_name` and `sheetname`. "
313-
"Use just `sheet_name`")
314-
315306
if not isinstance(io, ExcelFile):
316307
io = ExcelFile(io, engine=engine)
317308

318-
return io._parse_excel(
319-
sheetname=sheet_name,
309+
return io.parse(
310+
sheet_name=sheet_name,
320311
header=header,
321312
names=names,
322313
index_col=index_col,
@@ -435,7 +426,16 @@ def parse(self,
435426
docstring for more info on accepted parameters
436427
"""
437428

438-
return self._parse_excel(sheetname=sheet_name,
429+
# Can't use _deprecate_kwarg since sheetname=None has a special meaning
430+
if is_integer(sheet_name) and sheet_name == 0 and 'sheetname' in kwds:
431+
warnings.warn("The `sheetname` keyword is deprecated, use "
432+
"`sheet_name` instead", FutureWarning, stacklevel=2)
433+
sheet_name = kwds.pop("sheetname")
434+
elif 'sheetname' in kwds:
435+
raise TypeError("Cannot specify both `sheet_name` "
436+
"and `sheetname`. Use just `sheet_name`")
437+
438+
return self._parse_excel(sheet_name=sheet_name,
439439
header=header,
440440
names=names,
441441
index_col=index_col,
@@ -489,7 +489,7 @@ def _excel2num(x):
489489
return i in usecols
490490

491491
def _parse_excel(self,
492-
sheetname=0,
492+
sheet_name=0,
493493
header=0,
494494
names=None,
495495
index_col=None,
@@ -585,14 +585,14 @@ def _parse_cell(cell_contents, cell_typ):
585585
ret_dict = False
586586

587587
# Keep sheetname to maintain backwards compatibility.
588-
if isinstance(sheetname, list):
589-
sheets = sheetname
588+
if isinstance(sheet_name, list):
589+
sheets = sheet_name
590590
ret_dict = True
591-
elif sheetname is None:
591+
elif sheet_name is None:
592592
sheets = self.sheet_names
593593
ret_dict = True
594594
else:
595-
sheets = [sheetname]
595+
sheets = [sheet_name]
596596

597597
# handle same-type duplicates.
598598
sheets = list(OrderedDict.fromkeys(sheets).keys())

pandas/tests/io/test_excel.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,20 +503,35 @@ def test_sheet_name_and_sheetname(self, ext):
503503
# GH10559: Minor improvement: Change "sheet_name" to "sheetname"
504504
# GH10969: DOC: Consistent var names (sheetname vs sheet_name)
505505
# GH12604: CLN GH10559 Rename sheetname variable to sheet_name
506+
# GH20920: ExcelFile.parse() and pd.read_xlsx() have different
507+
# behavior for "sheetname" argument
506508
dfref = self.get_csv_refdf('test1')
507-
df1 = self.get_exceldf('test1', ext, sheet_name='Sheet1') # doc
509+
df1 = self.get_exceldf('test1', ext,
510+
sheet_name='Sheet1') # doc
508511
with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
509512
df2 = self.get_exceldf('test1', ext,
510513
sheetname='Sheet1') # bkwrd compat
511514

515+
excel = self.get_excelfile('test1', ext)
516+
df1_parse = excel.parse(sheet_name='Sheet1') # doc
517+
with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
518+
df2_parse = excel.parse(sheetname='Sheet1') # bkwrd compat
519+
512520
tm.assert_frame_equal(df1, dfref, check_names=False)
513521
tm.assert_frame_equal(df2, dfref, check_names=False)
522+
tm.assert_frame_equal(df1_parse, dfref, check_names=False)
523+
tm.assert_frame_equal(df2_parse, dfref, check_names=False)
514524

515525
def test_sheet_name_both_raises(self, ext):
516526
with tm.assert_raises_regex(TypeError, "Cannot specify both"):
517527
self.get_exceldf('test1', ext, sheetname='Sheet1',
518528
sheet_name='Sheet1')
519529

530+
excel = self.get_excelfile('test1', ext)
531+
with tm.assert_raises_regex(TypeError, "Cannot specify both"):
532+
excel.parse(sheetname='Sheet1',
533+
sheet_name='Sheet1')
534+
520535

521536
@pytest.mark.parametrize("ext", ['.xls', '.xlsx', '.xlsm'])
522537
class TestXlrdReader(ReadingTestsBase):

0 commit comments

Comments
 (0)