Skip to content

Commit 65ec968

Browse files
authored
TST: Decoupled more xlrd reading tests from openpyxl (#27114)
1 parent 2811464 commit 65ec968

File tree

3 files changed

+63
-50
lines changed

3 files changed

+63
-50
lines changed

pandas/tests/io/excel/test_readers.py

+53-50
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import pandas.util.testing as tm
1616

1717
from pandas.io.common import URLError
18-
from pandas.io.excel import ExcelFile
1918

2019

2120
@contextlib.contextmanager
@@ -736,121 +735,125 @@ class TestExcelFileRead:
736735
pytest.param(None, marks=pytest.mark.skipif(
737736
not td.safe_import("xlrd"), reason="no xlrd")),
738737
])
739-
def cd_and_set_engine(self, request, datapath, monkeypatch):
738+
def cd_and_set_engine(self, request, datapath, monkeypatch, read_ext):
740739
"""
741740
Change directory and set engine for ExcelFile objects.
742741
"""
742+
if request.param == 'openpyxl' and read_ext == '.xls':
743+
pytest.skip()
744+
743745
func = partial(pd.ExcelFile, engine=request.param)
744746
monkeypatch.chdir(datapath("io", "data"))
745747
monkeypatch.setattr(pd, 'ExcelFile', func)
746748

747749
def test_excel_passes_na(self, read_ext):
748750

749-
excel = ExcelFile('test4' + read_ext)
750-
751-
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=False,
752-
na_values=['apple'])
751+
with pd.ExcelFile('test4' + read_ext) as excel:
752+
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=False,
753+
na_values=['apple'])
753754
expected = DataFrame([['NA'], [1], ['NA'], [np.nan], ['rabbit']],
754755
columns=['Test'])
755756
tm.assert_frame_equal(parsed, expected)
756757

757-
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=True,
758-
na_values=['apple'])
758+
with pd.ExcelFile('test4' + read_ext) as excel:
759+
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=True,
760+
na_values=['apple'])
759761
expected = DataFrame([[np.nan], [1], [np.nan], [np.nan], ['rabbit']],
760762
columns=['Test'])
761763
tm.assert_frame_equal(parsed, expected)
762764

763765
# 13967
764-
excel = ExcelFile('test5' + read_ext)
765-
766-
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=False,
767-
na_values=['apple'])
766+
with pd.ExcelFile('test5' + read_ext) as excel:
767+
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=False,
768+
na_values=['apple'])
768769
expected = DataFrame([['1.#QNAN'], [1], ['nan'], [np.nan], ['rabbit']],
769770
columns=['Test'])
770771
tm.assert_frame_equal(parsed, expected)
771772

772-
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=True,
773-
na_values=['apple'])
773+
with pd.ExcelFile('test5' + read_ext) as excel:
774+
parsed = pd.read_excel(excel, 'Sheet1', keep_default_na=True,
775+
na_values=['apple'])
774776
expected = DataFrame([[np.nan], [1], [np.nan], [np.nan], ['rabbit']],
775777
columns=['Test'])
776778
tm.assert_frame_equal(parsed, expected)
777779

778780
@pytest.mark.parametrize('arg', ['sheet', 'sheetname', 'parse_cols'])
779781
def test_unexpected_kwargs_raises(self, read_ext, arg):
780782
# gh-17964
781-
excel = ExcelFile('test1' + read_ext)
782-
783783
kwarg = {arg: 'Sheet1'}
784784
msg = "unexpected keyword argument `{}`".format(arg)
785-
with pytest.raises(TypeError, match=msg):
786-
pd.read_excel(excel, **kwarg)
787785

788-
def test_excel_table_sheet_by_index(self, read_ext, df_ref):
786+
with pd.ExcelFile('test1' + read_ext) as excel:
787+
with pytest.raises(TypeError, match=msg):
788+
pd.read_excel(excel, **kwarg)
789789

790-
excel = ExcelFile('test1' + read_ext)
790+
def test_excel_table_sheet_by_index(self, read_ext, df_ref):
791791

792-
df1 = pd.read_excel(excel, 0, index_col=0)
793-
df2 = pd.read_excel(excel, 1, skiprows=[1], index_col=0)
792+
with pd.ExcelFile('test1' + read_ext) as excel:
793+
df1 = pd.read_excel(excel, 0, index_col=0)
794+
df2 = pd.read_excel(excel, 1, skiprows=[1], index_col=0)
794795
tm.assert_frame_equal(df1, df_ref, check_names=False)
795796
tm.assert_frame_equal(df2, df_ref, check_names=False)
796797

797-
df1 = excel.parse(0, index_col=0)
798-
df2 = excel.parse(1, skiprows=[1], index_col=0)
798+
with pd.ExcelFile('test1' + read_ext) as excel:
799+
df1 = excel.parse(0, index_col=0)
800+
df2 = excel.parse(1, skiprows=[1], index_col=0)
799801
tm.assert_frame_equal(df1, df_ref, check_names=False)
800802
tm.assert_frame_equal(df2, df_ref, check_names=False)
801803

802-
df3 = pd.read_excel(excel, 0, index_col=0, skipfooter=1)
804+
with pd.ExcelFile('test1' + read_ext) as excel:
805+
df3 = pd.read_excel(excel, 0, index_col=0, skipfooter=1)
803806
tm.assert_frame_equal(df3, df1.iloc[:-1])
804807

805808
with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
806-
df4 = pd.read_excel(excel, 0, index_col=0, skip_footer=1)
809+
with pd.ExcelFile('test1' + read_ext) as excel:
810+
df4 = pd.read_excel(excel, 0, index_col=0, skip_footer=1)
811+
807812
tm.assert_frame_equal(df3, df4)
808813

809-
df3 = excel.parse(0, index_col=0, skipfooter=1)
810-
tm.assert_frame_equal(df3, df1.iloc[:-1])
814+
with pd.ExcelFile('test1' + read_ext) as excel:
815+
df3 = excel.parse(0, index_col=0, skipfooter=1)
811816

812-
import xlrd # will move to engine-specific tests as new ones are added
813-
with pytest.raises(xlrd.XLRDError):
814-
pd.read_excel(excel, 'asdf')
817+
tm.assert_frame_equal(df3, df1.iloc[:-1])
815818

816819
def test_sheet_name(self, read_ext, df_ref):
817820
filename = "test1"
818821
sheet_name = "Sheet1"
819822

820-
excel = ExcelFile(filename + read_ext)
821-
df1_parse = excel.parse(sheet_name=sheet_name, index_col=0) # doc
822-
df2_parse = excel.parse(index_col=0,
823-
sheet_name=sheet_name)
823+
with pd.ExcelFile(filename + read_ext) as excel:
824+
df1_parse = excel.parse(sheet_name=sheet_name, index_col=0) # doc
825+
826+
with pd.ExcelFile(filename + read_ext) as excel:
827+
df2_parse = excel.parse(index_col=0,
828+
sheet_name=sheet_name)
824829

825830
tm.assert_frame_equal(df1_parse, df_ref, check_names=False)
826831
tm.assert_frame_equal(df2_parse, df_ref, check_names=False)
827832

828833
def test_excel_read_buffer(self, read_ext):
829-
830834
pth = 'test1' + read_ext
831-
expected = pd.read_excel(pth, 'Sheet1', index_col=0)
835+
engine = pd.ExcelFile.keywords['engine'] # TODO: fixturize
836+
expected = pd.read_excel(pth, 'Sheet1', index_col=0, engine=engine)
832837

833838
with open(pth, 'rb') as f:
834-
xls = ExcelFile(f)
835-
actual = pd.read_excel(xls, 'Sheet1', index_col=0)
839+
with pd.ExcelFile(f) as xls:
840+
actual = pd.read_excel(xls, 'Sheet1', index_col=0)
841+
836842
tm.assert_frame_equal(expected, actual)
837843

838844
def test_reader_closes_file(self, read_ext):
839-
840845
f = open('test1' + read_ext, 'rb')
841-
with ExcelFile(f) as xlsx:
846+
engine = pd.ExcelFile.keywords['engine'] # TODO: fixturize
847+
with pd.ExcelFile(f) as xlsx:
842848
# parses okay
843-
pd.read_excel(xlsx, 'Sheet1', index_col=0)
849+
pd.read_excel(xlsx, 'Sheet1', index_col=0, engine=engine)
844850

845851
assert f.closed
846852

847-
@pytest.mark.parametrize('excel_engine', [
848-
'xlrd',
849-
None
850-
])
851-
def test_read_excel_engine_value(self, read_ext, excel_engine):
853+
def test_conflicting_excel_engines(self, read_ext):
852854
# GH 26566
853-
xl = ExcelFile("test1" + read_ext, engine=excel_engine)
854855
msg = "Engine should not be specified when passing an ExcelFile"
855-
with pytest.raises(ValueError, match=msg):
856-
pd.read_excel(xl, engine='openpyxl')
856+
857+
with pd.ExcelFile("test1" + read_ext) as xl:
858+
with pytest.raises(ValueError, match=msg):
859+
pd.read_excel(xl, engine='foo')

pandas/tests/io/excel/test_writers.py

+2
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ class and any subclasses, on account of the `autouse=True`
250250
set_option(option_name, prev_engine) # Roll back option change
251251

252252

253+
@td.skip_if_no('xlrd')
253254
@pytest.mark.parametrize("engine,ext", [
254255
pytest.param('openpyxl', '.xlsx', marks=pytest.mark.skipif(
255256
not td.safe_import('openpyxl'), reason='No openpyxl')),
@@ -1252,6 +1253,7 @@ def check_called(func):
12521253
'something.xls', engine='dummy'))
12531254

12541255

1256+
@td.skip_if_no('xlrd')
12551257
@td.skip_if_no('openpyxl')
12561258
@pytest.mark.skipif(not PY36, reason='requires fspath')
12571259
class TestFSPath:

pandas/tests/io/excel/test_xlrd.py

+8
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,11 @@ def test_read_xlrd_book(read_ext, frame):
2727
result = pd.read_excel(book, sheet_name=sheet_name,
2828
engine=engine, index_col=0)
2929
tm.assert_frame_equal(df, result)
30+
31+
32+
# TODO: test for openpyxl as well
33+
def test_excel_table_sheet_by_index(datapath, read_ext):
34+
path = datapath("io", "data", 'test1{}'.format(read_ext))
35+
with pd.ExcelFile(path) as excel:
36+
with pytest.raises(xlrd.XLRDError):
37+
pd.read_excel(excel, 'asdf')

0 commit comments

Comments
 (0)