10
10
TYPE_CHECKING ,
11
11
Any ,
12
12
Union ,
13
+ cast ,
13
14
)
14
15
16
+ from pandas ._typing import Scalar
15
17
from pandas .compat ._optional import import_optional_dependency
16
18
from pandas .util ._decorators import doc
17
19
28
30
29
31
from pandas ._typing import (
30
32
FilePath ,
31
- NaTType ,
32
33
ReadBuffer ,
33
- Scalar ,
34
34
StorageOptions ,
35
35
)
36
36
37
- _CellValue = Union [int , float , str , bool , time , date , datetime , timedelta ]
37
+ _CellValueT = Union [int , float , str , bool , time , date , datetime , timedelta ]
38
38
39
39
40
40
class CalamineReader (BaseExcelReader ["CalamineWorkbook" ]):
@@ -75,8 +75,7 @@ def load_workbook(
75
75
from python_calamine import load_workbook
76
76
77
77
return load_workbook (
78
- filepath_or_buffer ,
79
- ** engine_kwargs ,
78
+ filepath_or_buffer , ** engine_kwargs # type: ignore[arg-type]
80
79
)
81
80
82
81
@property
@@ -99,26 +98,31 @@ def get_sheet_by_index(self, index: int) -> CalamineSheet:
99
98
100
99
def get_sheet_data (
101
100
self , sheet : CalamineSheet , file_rows_needed : int | None = None
102
- ) -> list [list [Scalar | NaTType | time ]]:
103
- def _convert_cell (value : _CellValue ) -> Scalar | NaTType | time :
101
+ ) -> list [list [Scalar ]]:
102
+ def _convert_cell (value : _CellValueT ) -> Scalar :
103
+ # Avoid explicit conversion to pd.Timestamp and pd.Timedelta
104
104
if isinstance (value , float ):
105
105
val = int (value )
106
106
if val == value :
107
107
return val
108
108
else :
109
109
return value
110
110
elif isinstance (value , date ):
111
- return pd . Timestamp ( value )
111
+ return value
112
112
elif isinstance (value , timedelta ):
113
- return pd .Timedelta (value )
114
- elif isinstance (value , time ):
115
113
return value
114
+ elif isinstance (value , time ):
115
+ # cast needed here because Scalar doesn't include datetime.time
116
+ return cast (Scalar , value )
116
117
117
118
return value
118
119
119
- rows : list [list [_CellValue ]] = sheet .to_python (
120
- skip_empty_area = False , nrows = file_rows_needed
121
- )
122
- data = [[_convert_cell (cell ) for cell in row ] for row in rows ]
120
+ rows : list [list [_CellValueT ]] = sheet .to_python (skip_empty_area = False )
121
+ data : list [list [Scalar ]] = []
122
+
123
+ for row in rows :
124
+ data .append ([_convert_cell (cell ) for cell in row ])
125
+ if file_rows_needed is not None and len (data ) >= file_rows_needed :
126
+ break
123
127
124
128
return data
0 commit comments