@@ -997,6 +997,7 @@ def __init__(self, path_or_buf, convert_dates=True,
997
997
self .path_or_buf = BytesIO (contents )
998
998
999
999
self ._read_header ()
1000
+ self ._setup_dtype ()
1000
1001
1001
1002
def __enter__ (self ):
1002
1003
""" enter context manager """
@@ -1299,6 +1300,20 @@ def _read_old_header(self, first_char):
1299
1300
# necessary data to continue parsing
1300
1301
self .data_location = self .path_or_buf .tell ()
1301
1302
1303
+ def _setup_dtype (self ):
1304
+ # Setup the dtype.
1305
+ if self ._dtype is None :
1306
+ dtype = [] # Convert struct data types to numpy data type
1307
+ for i , typ in enumerate (self .typlist ):
1308
+ if typ in self .NUMPY_TYPE_MAP :
1309
+ dtype .append (('s' + str (i ), self .byteorder +
1310
+ self .NUMPY_TYPE_MAP [typ ]))
1311
+ else :
1312
+ dtype .append (('s' + str (i ), 'S' + str (typ )))
1313
+ dtype = np .dtype (dtype )
1314
+ self ._dtype = dtype
1315
+ return self ._dtype
1316
+
1302
1317
def _calcsize (self , fmt ):
1303
1318
return (type (fmt ) is int and fmt or
1304
1319
struct .calcsize (self .byteorder + fmt ))
@@ -1408,6 +1423,7 @@ def _read_strls(self):
1408
1423
# Wrap v_o in a string to allow uint64 values as keys on 32bit OS
1409
1424
self .GSO [str (v_o )] = va
1410
1425
1426
+
1411
1427
# legacy
1412
1428
@Appender (_data_method_doc )
1413
1429
def data (self , ** kwargs ):
@@ -1476,20 +1492,9 @@ def read(self, nrows=None, convert_dates=None,
1476
1492
self ._can_read_value_labels = True
1477
1493
self ._read_strls ()
1478
1494
1479
- # Setup the dtype.
1480
- if self ._dtype is None :
1481
- dtype = [] # Convert struct data types to numpy data type
1482
- for i , typ in enumerate (self .typlist ):
1483
- if typ in self .NUMPY_TYPE_MAP :
1484
- dtype .append (('s' + str (i ), self .byteorder +
1485
- self .NUMPY_TYPE_MAP [typ ]))
1486
- else :
1487
- dtype .append (('s' + str (i ), 'S' + str (typ )))
1488
- dtype = np .dtype (dtype )
1489
- self ._dtype = dtype
1490
1495
1491
1496
# Read data
1492
- dtype = self ._dtype
1497
+ dtype = self ._setup_dtype ()
1493
1498
max_read_len = (self .nobs - self ._lines_read ) * dtype .itemsize
1494
1499
read_len = nrows * dtype .itemsize
1495
1500
read_len = min (read_len , max_read_len )
0 commit comments