@@ -365,25 +365,34 @@ def _convert_data(
365
365
clean_dtypes ,
366
366
)
367
367
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
+
368
379
def _infer_columns (
369
380
self ,
370
381
) -> tuple [list [list [Scalar | None ]], int , set [Scalar | None ]]:
371
382
names = self .names
372
383
num_original_columns = 0
373
384
clear_buffer = True
374
385
unnamed_cols : set [Scalar | None ] = set ()
375
- self ._header_line = None
376
386
377
387
if self .header is not None :
378
388
header = self .header
389
+ have_mi_columns = self ._have_mi_columns
379
390
380
391
if isinstance (header , (list , tuple , np .ndarray )):
381
- have_mi_columns = len (header ) > 1
382
392
# we have a mi columns, so read an extra line
383
393
if have_mi_columns :
384
394
header = list (header ) + [header [- 1 ] + 1 ]
385
395
else :
386
- have_mi_columns = False
387
396
header = [header ]
388
397
389
398
columns : list [list [Scalar | None ]] = []
@@ -531,27 +540,14 @@ def _infer_columns(
531
540
columns , columns [0 ], num_original_columns
532
541
)
533
542
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 )
546
544
num_original_columns = ncols
547
545
548
546
if not names :
549
547
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 )
555
551
num_original_columns = len (names )
556
552
elif not callable (self .usecols ) and len (names ) != len (self .usecols ):
557
553
raise ValueError (
@@ -560,12 +556,26 @@ def _infer_columns(
560
556
)
561
557
else :
562
558
# Ignore output but set used columns.
563
- self ._handle_usecols ([names ], names , ncols )
564
559
columns = [names ]
565
- num_original_columns = ncols
560
+ self . _handle_usecols ( columns , columns [ 0 ], ncols )
566
561
567
562
return columns , num_original_columns , unnamed_cols
568
563
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
+
569
579
def _handle_usecols (
570
580
self ,
571
581
columns : list [list [Scalar | None ]],
0 commit comments