@@ -604,7 +604,7 @@ cdef class TextReader:
604
604
# Corner case, not enough lines in the file
605
605
if self .parser.lines < data_line + 1 :
606
606
field_count = len (header)
607
- elif not self .has_usecols:
607
+ else : # not self.has_usecols:
608
608
field_count = self .parser.line_fields[data_line]
609
609
610
610
passed_count = len (header)
@@ -614,15 +614,18 @@ cdef class TextReader:
614
614
' data has %d fields'
615
615
% (passed_count, field_count))
616
616
617
+ if self .has_usecols:
618
+ nuse = len (self .usecols)
619
+ if nuse == passed_count:
620
+ self .leading_cols = 0
621
+ elif self .names is None and nuse < passed_count:
622
+ self .leading_cols = field_count - passed_count
623
+ elif passed_count != field_count:
624
+ raise ValueError (' Passed header names '
625
+ ' mismatches usecols' )
617
626
# oh boy, #2442
618
- if self .allow_leading_cols:
627
+ elif self .allow_leading_cols:
619
628
self .leading_cols = field_count - passed_count
620
- else :
621
- # TODO: some better check here
622
- # field_count = len(header)
623
- n = len (header)
624
- if n != field_count and n != len (self .usecols):
625
- raise ValueError (' Passed header names mismatches usecols' )
626
629
627
630
return header, field_count
628
631
@@ -795,11 +798,14 @@ cdef class TextReader:
795
798
results = {}
796
799
nused = 0
797
800
for i in range (self .table_width):
798
- name = self ._get_column_name(i, nused)
799
-
800
- if self .has_usecols and not (i in self .usecols or
801
- name in self .usecols):
802
- continue
801
+ if i < self .leading_cols:
802
+ # Pass through leading columns always
803
+ name = i
804
+ else :
805
+ name = self ._get_column_name(i, nused)
806
+ if self .has_usecols and not (i in self .usecols or
807
+ name in self .usecols):
808
+ continue
803
809
804
810
conv = self ._get_converter(i, name)
805
811
@@ -837,8 +843,9 @@ cdef class TextReader:
837
843
838
844
results[i] = col_res
839
845
840
- # number of used columns
841
- nused += 1
846
+ # number of used column names
847
+ if i > self .leading_cols:
848
+ nused += 1
842
849
843
850
self .parser_start += end - start
844
851
@@ -1013,7 +1020,7 @@ cdef class TextReader:
1013
1020
if len (self .names) == len (self .usecols):
1014
1021
return self .names[nused]
1015
1022
else :
1016
- return self .names[i]
1023
+ return self .names[i - self .leading_cols ]
1017
1024
else :
1018
1025
if self .header is not None :
1019
1026
j = i - self .leading_cols
0 commit comments