Skip to content

Commit 75c8698

Browse files
TST: Fix excel test discovery (#16478)
* TST: Fix excel test discovery * BUG: Handle sheetname deprecation directly Since sheetname=None has a special meaning, we can't use the deprecate_kwargs decorator. We instead handle it in read_excel. * TST/BUG: Ensure pathlib roundtrip uses right params Reader / writer may depend on filename and engine. Set these on the reader and writer before round-tripping.
1 parent 3c9a74b commit 75c8698

File tree

2 files changed

+42
-22
lines changed

2 files changed

+42
-22
lines changed

pandas/io/excel.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import os
1010
import abc
11+
import warnings
1112
import numpy as np
1213

1314
from pandas.core.dtypes.common import (
@@ -30,7 +31,7 @@
3031
import pandas.compat.openpyxl_compat as openpyxl_compat
3132
from warnings import warn
3233
from distutils.version import LooseVersion
33-
from pandas.util._decorators import Appender, deprecate_kwarg
34+
from pandas.util._decorators import Appender
3435
from textwrap import fill
3536

3637
__all__ = ["read_excel", "ExcelWriter", "ExcelFile"]
@@ -193,7 +194,6 @@ def get_writer(engine_name):
193194
raise ValueError("No Excel writer '%s'" % engine_name)
194195

195196

196-
@deprecate_kwarg('sheetname', 'sheet_name')
197197
@Appender(_read_excel_doc)
198198
def read_excel(io, sheet_name=0, header=0, skiprows=None, skip_footer=0,
199199
index_col=None, names=None, parse_cols=None, parse_dates=False,
@@ -202,6 +202,15 @@ def read_excel(io, sheet_name=0, header=0, skiprows=None, skip_footer=0,
202202
dtype=None, true_values=None, false_values=None, engine=None,
203203
squeeze=False, **kwds):
204204

205+
# Can't use _deprecate_kwarg since sheetname=None has a special meaning
206+
if is_integer(sheet_name) and sheet_name == 0 and 'sheetname' in kwds:
207+
warnings.warn("The `sheetname` keyword is deprecated, use "
208+
"`sheet_name` instead", FutureWarning, stacklevel=2)
209+
sheet_name = kwds.pop("sheetname")
210+
elif 'sheetname' in kwds:
211+
raise TypeError("Cannot specify both `sheet_name` and `sheetname`. "
212+
"Use just `sheet_name`")
213+
205214
if not isinstance(io, ExcelFile):
206215
io = ExcelFile(io, engine=engine)
207216

pandas/tests/io/test_excel.py

+31-20
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sys
66
import os
77
from distutils.version import LooseVersion
8+
from functools import partial
89

910
import warnings
1011
from warnings import catch_warnings
@@ -407,7 +408,7 @@ def test_reading_all_sheets(self):
407408
# Ensure a dict is returned.
408409
# See PR #9450
409410
basename = 'test_multisheet'
410-
dfs = self.get_exceldf(basename, sheetname=None)
411+
dfs = self.get_exceldf(basename, sheet_name=None)
411412
# ensure this is not alphabetical to test order preservation
412413
expected_keys = ['Charlie', 'Alpha', 'Beta']
413414
tm.assert_contains_all(expected_keys, dfs.keys())
@@ -424,7 +425,7 @@ def test_reading_multiple_specific_sheets(self):
424425
basename = 'test_multisheet'
425426
# Explicitly request duplicates. Only the set should be returned.
426427
expected_keys = [2, 'Charlie', 'Charlie']
427-
dfs = self.get_exceldf(basename, sheetname=expected_keys)
428+
dfs = self.get_exceldf(basename, sheet_name=expected_keys)
428429
expected_keys = list(set(expected_keys))
429430
tm.assert_contains_all(expected_keys, dfs.keys())
430431
assert len(expected_keys) == len(dfs.keys())
@@ -434,7 +435,7 @@ def test_reading_all_sheets_with_blank(self):
434435
# In the case where some sheets are blank.
435436
# Issue #11711
436437
basename = 'blank_with_header'
437-
dfs = self.get_exceldf(basename, sheetname=None)
438+
dfs = self.get_exceldf(basename, sheet_name=None)
438439
expected_keys = ['Sheet1', 'Sheet2', 'Sheet3']
439440
tm.assert_contains_all(expected_keys, dfs.keys())
440441

@@ -551,11 +552,15 @@ def test_sheet_name_and_sheetname(self):
551552
dfref = self.get_csv_refdf('test1')
552553
df1 = self.get_exceldf('test1', sheet_name='Sheet1') # doc
553554
with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
554-
df2 = self.get_exceldf('test1', sheetname='Sheet2') # bkwrd compat
555+
df2 = self.get_exceldf('test1', sheetname='Sheet1') # bkwrd compat
555556

556557
tm.assert_frame_equal(df1, dfref, check_names=False)
557558
tm.assert_frame_equal(df2, dfref, check_names=False)
558559

560+
def test_sheet_name_both_raises(self):
561+
with tm.assert_raises_regex(TypeError, "Cannot specify both"):
562+
self.get_exceldf('test1', sheetname='Sheet1', sheet_name='Sheet1')
563+
559564

560565
class XlrdTests(ReadingTestsBase):
561566
"""
@@ -589,7 +594,7 @@ def test_read_xlrd_Book(self):
589594
result = read_excel(xl, "SheetA")
590595
tm.assert_frame_equal(df, result)
591596

592-
result = read_excel(book, sheetname="SheetA", engine="xlrd")
597+
result = read_excel(book, sheet_name="SheetA", engine="xlrd")
593598
tm.assert_frame_equal(df, result)
594599

595600
@tm.network
@@ -691,7 +696,7 @@ def tdf(sheetname):
691696
with ExcelWriter(pth) as ew:
692697
for sheetname, df in iteritems(dfs):
693698
df.to_excel(ew, sheetname)
694-
dfs_returned = read_excel(pth, sheetname=sheets)
699+
dfs_returned = read_excel(pth, sheet_name=sheets)
695700
for s in sheets:
696701
tm.assert_frame_equal(dfs[s], dfs_returned[s])
697702

@@ -1001,19 +1006,19 @@ def test_read_excel_squeeze(self):
10011006
tm.assert_series_equal(actual, expected)
10021007

10031008

1004-
class XlsReaderTests(XlrdTests):
1009+
class TestXlsReaderTests(XlrdTests):
10051010
ext = '.xls'
10061011
engine_name = 'xlrd'
10071012
check_skip = staticmethod(_skip_if_no_xlrd)
10081013

10091014

1010-
class XlsxReaderTests(XlrdTests):
1015+
class TestXlsxReaderTests(XlrdTests):
10111016
ext = '.xlsx'
10121017
engine_name = 'xlrd'
10131018
check_skip = staticmethod(_skip_if_no_xlrd)
10141019

10151020

1016-
class XlsmReaderTests(XlrdTests):
1021+
class TestXlsmReaderTests(XlrdTests):
10171022
ext = '.xlsm'
10181023
engine_name = 'xlrd'
10191024
check_skip = staticmethod(_skip_if_no_xlrd)
@@ -1872,12 +1877,18 @@ def test_freeze_panes(self):
18721877

18731878
def test_path_pathlib(self):
18741879
df = tm.makeDataFrame()
1875-
result = tm.round_trip_pathlib(df.to_excel, pd.read_excel)
1880+
writer = partial(df.to_excel, engine=self.engine_name)
1881+
reader = partial(pd.read_excel)
1882+
result = tm.round_trip_pathlib(writer, reader,
1883+
path="foo.{}".format(self.ext))
18761884
tm.assert_frame_equal(df, result)
18771885

18781886
def test_path_localpath(self):
18791887
df = tm.makeDataFrame()
1880-
result = tm.round_trip_localpath(df.to_excel, pd.read_excel)
1888+
writer = partial(df.to_excel, engine=self.engine_name)
1889+
reader = partial(pd.read_excel)
1890+
result = tm.round_trip_pathlib(writer, reader,
1891+
path="foo.{}".format(self.ext))
18811892
tm.assert_frame_equal(df, result)
18821893

18831894

@@ -1909,7 +1920,7 @@ def versioned_raise_on_incompat_version(cls):
19091920

19101921

19111922
@raise_on_incompat_version(1)
1912-
class OpenpyxlTests(ExcelWriterBase):
1923+
class TestOpenpyxlTests(ExcelWriterBase):
19131924
ext = '.xlsx'
19141925
engine_name = 'openpyxl1'
19151926
check_skip = staticmethod(lambda *args, **kwargs: None)
@@ -1962,7 +1973,7 @@ def setup_class(cls):
19621973

19631974
@raise_on_incompat_version(2)
19641975
@skip_openpyxl_gt21
1965-
class Openpyxl20Tests(ExcelWriterBase):
1976+
class TestOpenpyxl20Tests(ExcelWriterBase):
19661977
ext = '.xlsx'
19671978
engine_name = 'openpyxl20'
19681979
check_skip = staticmethod(lambda *args, **kwargs: None)
@@ -2078,7 +2089,7 @@ def setup_class(cls):
20782089

20792090
@raise_on_incompat_version(2)
20802091
@skip_openpyxl_lt22
2081-
class Openpyxl22Tests(ExcelWriterBase):
2092+
class TestOpenpyxl22Tests(ExcelWriterBase):
20822093
ext = '.xlsx'
20832094
engine_name = 'openpyxl22'
20842095
check_skip = staticmethod(lambda *args, **kwargs: None)
@@ -2173,7 +2184,7 @@ def test_write_cells_merge_styled(self):
21732184
assert xcell_a2.font == openpyxl_sty_merged
21742185

21752186

2176-
class XlwtTests(ExcelWriterBase):
2187+
class TestXlwtTests(ExcelWriterBase):
21772188
ext = '.xls'
21782189
engine_name = 'xlwt'
21792190
check_skip = staticmethod(_skip_if_no_xlwt)
@@ -2230,7 +2241,7 @@ def test_to_excel_styleconverter(self):
22302241
assert xlwt.Alignment.VERT_TOP == xls_style.alignment.vert
22312242

22322243

2233-
class XlsxWriterTests(ExcelWriterBase):
2244+
class TestXlsxWriterTests(ExcelWriterBase):
22342245
ext = '.xlsx'
22352246
engine_name = 'xlsxwriter'
22362247
check_skip = staticmethod(_skip_if_no_xlsxwriter)
@@ -2283,7 +2294,7 @@ def test_column_format(self):
22832294
assert read_num_format == num_format
22842295

22852296

2286-
class OpenpyxlTests_NoMerge(ExcelWriterBase):
2297+
class TestOpenpyxlTests_NoMerge(ExcelWriterBase):
22872298
ext = '.xlsx'
22882299
engine_name = 'openpyxl'
22892300
check_skip = staticmethod(_skip_if_no_openpyxl)
@@ -2292,7 +2303,7 @@ class OpenpyxlTests_NoMerge(ExcelWriterBase):
22922303
merge_cells = False
22932304

22942305

2295-
class XlwtTests_NoMerge(ExcelWriterBase):
2306+
class TestXlwtTests_NoMerge(ExcelWriterBase):
22962307
ext = '.xls'
22972308
engine_name = 'xlwt'
22982309
check_skip = staticmethod(_skip_if_no_xlwt)
@@ -2301,7 +2312,7 @@ class XlwtTests_NoMerge(ExcelWriterBase):
23012312
merge_cells = False
23022313

23032314

2304-
class XlsxWriterTests_NoMerge(ExcelWriterBase):
2315+
class TestXlsxWriterTests_NoMerge(ExcelWriterBase):
23052316
ext = '.xlsx'
23062317
engine_name = 'xlsxwriter'
23072318
check_skip = staticmethod(_skip_if_no_xlsxwriter)
@@ -2310,7 +2321,7 @@ class XlsxWriterTests_NoMerge(ExcelWriterBase):
23102321
merge_cells = False
23112322

23122323

2313-
class ExcelWriterEngineTests(object):
2324+
class TestExcelWriterEngineTests(object):
23142325

23152326
def test_ExcelWriter_dispatch(self):
23162327
with tm.assert_raises_regex(ValueError, 'No engine'):

0 commit comments

Comments
 (0)