Skip to content

Commit 0eef76d

Browse files
jbrockmendelim-vinicius
authored and
im-vinicius
committed
REF: define _header_line and have_mi_columns non-dynamically (pandas-dev#53091)
1 parent 1af0df0 commit 0eef76d

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

pandas/io/parsers/python_parser.py

+32-22
Original file line numberDiff line numberDiff line change
@@ -365,25 +365,34 @@ def _convert_data(
365365
clean_dtypes,
366366
)
367367

368+
@cache_readonly
369+
def _have_mi_columns(self) -> bool:
370+
if self.header is None:
371+
return False
372+
373+
header = self.header
374+
if isinstance(header, (list, tuple, np.ndarray)):
375+
return len(header) > 1
376+
else:
377+
return False
378+
368379
def _infer_columns(
369380
self,
370381
) -> tuple[list[list[Scalar | None]], int, set[Scalar | None]]:
371382
names = self.names
372383
num_original_columns = 0
373384
clear_buffer = True
374385
unnamed_cols: set[Scalar | None] = set()
375-
self._header_line = None
376386

377387
if self.header is not None:
378388
header = self.header
389+
have_mi_columns = self._have_mi_columns
379390

380391
if isinstance(header, (list, tuple, np.ndarray)):
381-
have_mi_columns = len(header) > 1
382392
# we have a mi columns, so read an extra line
383393
if have_mi_columns:
384394
header = list(header) + [header[-1] + 1]
385395
else:
386-
have_mi_columns = False
387396
header = [header]
388397

389398
columns: list[list[Scalar | None]] = []
@@ -531,27 +540,14 @@ def _infer_columns(
531540
columns, columns[0], num_original_columns
532541
)
533542
else:
534-
try:
535-
line = self._buffered_line()
536-
537-
except StopIteration as err:
538-
if not names:
539-
raise EmptyDataError("No columns to parse from file") from err
540-
541-
line = names[:]
542-
543-
# Store line, otherwise it is lost for guessing the index
544-
self._header_line = line
545-
ncols = len(line)
543+
ncols = len(self._header_line)
546544
num_original_columns = ncols
547545

548546
if not names:
549547
columns = [list(range(ncols))]
550-
columns = self._handle_usecols(
551-
columns, columns[0], num_original_columns
552-
)
553-
elif self.usecols is None or len(names) >= num_original_columns:
554-
columns = self._handle_usecols([names], names, num_original_columns)
548+
columns = self._handle_usecols(columns, columns[0], ncols)
549+
elif self.usecols is None or len(names) >= ncols:
550+
columns = self._handle_usecols([names], names, ncols)
555551
num_original_columns = len(names)
556552
elif not callable(self.usecols) and len(names) != len(self.usecols):
557553
raise ValueError(
@@ -560,12 +556,26 @@ def _infer_columns(
560556
)
561557
else:
562558
# Ignore output but set used columns.
563-
self._handle_usecols([names], names, ncols)
564559
columns = [names]
565-
num_original_columns = ncols
560+
self._handle_usecols(columns, columns[0], ncols)
566561

567562
return columns, num_original_columns, unnamed_cols
568563

564+
@cache_readonly
565+
def _header_line(self):
566+
# Store line for reuse in _get_index_name
567+
if self.header is not None:
568+
return None
569+
570+
try:
571+
line = self._buffered_line()
572+
except StopIteration as err:
573+
if not self.names:
574+
raise EmptyDataError("No columns to parse from file") from err
575+
576+
line = self.names[:]
577+
return line
578+
569579
def _handle_usecols(
570580
self,
571581
columns: list[list[Scalar | None]],

0 commit comments

Comments
 (0)