Skip to content

Commit 8f53f18

Browse files
committed
DEPR: deprecated sheetname from ExcelFile.parse
* ExcelFile.parse * Made to raise FutureWarning and TypeError when using `sheetname` * ExcelFile._parse_excel * Changed parameter name from `sheetname` to `sheet_name`
1 parent 3471b98 commit 8f53f18

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

doc/source/whatsnew/v0.23.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,7 @@ Deprecations
956956
retain the previous behavior, use a list instead of a tuple (:issue:`18314`)
957957
- ``Series.valid`` is deprecated. Use :meth:`Series.dropna` instead (:issue:`18800`).
958958
- :func:`read_excel` has deprecated the ``skip_footer`` parameter. Use ``skipfooter`` instead (:issue:`18836`)
959+
- :meth:`ExcelFile.parse` has deprecated ``sheetname`` in favor of ``sheet_name`` for consistency with :func:`read_excel` (:issue:`20920`).
959960
- The ``is_copy`` attribute is deprecated and will be removed in a future version (:issue:`18801`).
960961
- ``IntervalIndex.from_intervals`` is deprecated in favor of the :class:`IntervalIndex` constructor (:issue:`19263`)
961962
- ``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

+16-7
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ def read_excel(io,
316316
io = ExcelFile(io, engine=engine)
317317

318318
return io._parse_excel(
319-
sheetname=sheet_name,
319+
sheet_name=sheet_name,
320320
header=header,
321321
names=names,
322322
index_col=index_col,
@@ -435,7 +435,16 @@ def parse(self,
435435
docstring for more info on accepted parameters
436436
"""
437437

438-
return self._parse_excel(sheetname=sheet_name,
438+
# Can't use _deprecate_kwarg since sheetname=None has a special meaning
439+
if is_integer(sheet_name) and sheet_name == 0 and 'sheetname' in kwds:
440+
warnings.warn("The `sheetname` keyword is deprecated, use "
441+
"`sheet_name` instead", FutureWarning, stacklevel=2)
442+
sheet_name = kwds.pop("sheetname")
443+
elif 'sheetname' in kwds:
444+
raise TypeError("Cannot specify both `sheet_name` "
445+
"and `sheetname`. Use just `sheet_name`")
446+
447+
return self._parse_excel(sheet_name=sheet_name,
439448
header=header,
440449
names=names,
441450
index_col=index_col,
@@ -489,7 +498,7 @@ def _excel2num(x):
489498
return i in usecols
490499

491500
def _parse_excel(self,
492-
sheetname=0,
501+
sheet_name=0,
493502
header=0,
494503
names=None,
495504
index_col=None,
@@ -585,14 +594,14 @@ def _parse_cell(cell_contents, cell_typ):
585594
ret_dict = False
586595

587596
# Keep sheetname to maintain backwards compatibility.
588-
if isinstance(sheetname, list):
589-
sheets = sheetname
597+
if isinstance(sheet_name, list):
598+
sheets = sheet_name
590599
ret_dict = True
591-
elif sheetname is None:
600+
elif sheet_name is None:
592601
sheets = self.sheet_names
593602
ret_dict = True
594603
else:
595-
sheets = [sheetname]
604+
sheets = [sheet_name]
596605

597606
# handle same-type duplicates.
598607
sheets = list(OrderedDict.fromkeys(sheets).keys())

pandas/tests/io/test_excel.py

+16-1
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)