@@ -364,6 +364,7 @@ class ZipInfo (object):
364
364
'CRC' ,
365
365
'compress_size' ,
366
366
'file_size' ,
367
+ 'data_offset' ,
367
368
'_raw_time' ,
368
369
)
369
370
@@ -406,6 +407,7 @@ def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
406
407
self .external_attr = 0 # External file attributes
407
408
self .compress_size = 0 # Size of the compressed file
408
409
self .file_size = 0 # Size of the uncompressed file
410
+ self .data_offset = None # Offset to beginning of compressed data
409
411
# Other attributes are set by class ZipFile:
410
412
# header_offset Byte offset to the file header
411
413
# CRC CRC-32 of the uncompressed file
@@ -1340,6 +1342,16 @@ def __repr__(self):
1340
1342
result .append ('>' )
1341
1343
return '' .join (result )
1342
1344
1345
+ def _ComputeDataOffset (self , zinfo : ZipInfo ):
1346
+ if self .fp .seekable ():
1347
+ self .fp .seek (zinfo .header_offset )
1348
+ fheader = struct .unpack (structFileHeader , self .fp .read (sizeFileHeader ))
1349
+ if fheader [_FH_SIGNATURE ] != stringFileHeader :
1350
+ return
1351
+ return zinfo .header_offset + \
1352
+ fheader [_FH_FILENAME_LENGTH ] + \
1353
+ fheader [_FH_EXTRA_FIELD_LENGTH ] + sizeFileHeader
1354
+
1343
1355
def _RealGetContents (self ):
1344
1356
"""Read in the table of contents for the ZIP file."""
1345
1357
fp = self .fp
@@ -1406,6 +1418,7 @@ def _RealGetContents(self):
1406
1418
1407
1419
x ._decodeExtra ()
1408
1420
x .header_offset = x .header_offset + concat
1421
+ x .data_offset = self ._ComputeDataOffset (x )
1409
1422
self .filelist .append (x )
1410
1423
self .NameToInfo [x .filename ] = x
1411
1424
0 commit comments