diff --git a/doc/source/whatsnew/v0.22.0.txt b/doc/source/whatsnew/v0.22.0.txt index 943b6bb84fb47..41b9fbe5a4838 100644 --- a/doc/source/whatsnew/v0.22.0.txt +++ b/doc/source/whatsnew/v0.22.0.txt @@ -90,6 +90,7 @@ Bug Fixes - Bug in ``pd.read_msgpack()`` with a non existent file is passed in Python 2 (:issue:`15296`) - Bug in ``DataFrame.groupby`` where key as tuple in a ``MultiIndex`` were interpreted as a list of keys (:issue:`17979`) - Bug in :func:`pd.read_csv` where a ``MultiIndex`` with duplicate columns was not being mangled appropriately (:issue:`18062`) +- Bug in :func:`pd.read_sas` where a file with 0 variables gave an ``AttributeError`` incorrectly. Now it gives an ``EmptyDataError`` Conversion ^^^^^^^^^^ diff --git a/pandas/io/sas/sas7bdat.py b/pandas/io/sas/sas7bdat.py index 2b3a91e2062b1..1d57093585ef2 100644 --- a/pandas/io/sas/sas7bdat.py +++ b/pandas/io/sas/sas7bdat.py @@ -17,6 +17,7 @@ import pandas as pd from pandas import compat from pandas.io.common import get_filepath_or_buffer, BaseIterator +from pandas.errors import EmptyDataError import numpy as np import struct import pandas.io.sas.sas_constants as const @@ -594,6 +595,9 @@ def read(self, nrows=None): elif nrows is None: nrows = self.row_count + if len(self.column_types) == 0: + raise EmptyDataError("No columns to parse from file") + if self._current_row_in_file_index >= self.row_count: return None diff --git a/pandas/tests/io/sas/data/zero_variables.sas7bdat b/pandas/tests/io/sas/data/zero_variables.sas7bdat new file mode 100644 index 0000000000000..85fec09447ec5 Binary files /dev/null and b/pandas/tests/io/sas/data/zero_variables.sas7bdat differ diff --git a/pandas/tests/io/sas/test_sas7bdat.py b/pandas/tests/io/sas/test_sas7bdat.py index c3fb85811ca2a..a5546b1198fc6 100644 --- a/pandas/tests/io/sas/test_sas7bdat.py +++ b/pandas/tests/io/sas/test_sas7bdat.py @@ -1,9 +1,11 @@ import pandas as pd from pandas.compat import PY2 import pandas.util.testing as tm +from pandas.errors import EmptyDataError import os import io import numpy as np +import pytest class TestSAS7BDAT(object): @@ -174,3 +176,11 @@ def test_date_time(): df0 = pd.read_csv(fname, parse_dates=['Date1', 'Date2', 'DateTime', 'DateTimeHi', 'Taiw']) tm.assert_frame_equal(df, df0) + + +def test_zero_variables(): + # Check if the SAS file has zero variables (PR #18184) + dirpath = tm.get_data_path() + fname = os.path.join(dirpath, "zero_variables.sas7bdat") + with pytest.raises(EmptyDataError): + pd.read_sas(fname)