(self, offset, whence=0)
| 1084 | return self._seekable |
| 1085 | |
| 1086 | def seek(self, offset, whence=0): |
| 1087 | if self.closed: |
| 1088 | raise ValueError("seek on closed file.") |
| 1089 | if not self._seekable: |
| 1090 | raise io.UnsupportedOperation("underlying stream is not seekable") |
| 1091 | curr_pos = self.tell() |
| 1092 | if whence == 0: # Seek from start of file |
| 1093 | new_pos = offset |
| 1094 | elif whence == 1: # Seek from current position |
| 1095 | new_pos = curr_pos + offset |
| 1096 | elif whence == 2: # Seek from EOF |
| 1097 | new_pos = self._orig_file_size + offset |
| 1098 | else: |
| 1099 | raise ValueError("whence must be os.SEEK_SET (0), " |
| 1100 | "os.SEEK_CUR (1), or os.SEEK_END (2)") |
| 1101 | |
| 1102 | if new_pos > self._orig_file_size: |
| 1103 | new_pos = self._orig_file_size |
| 1104 | |
| 1105 | if new_pos < 0: |
| 1106 | new_pos = 0 |
| 1107 | |
| 1108 | read_offset = new_pos - curr_pos |
| 1109 | buff_offset = read_offset + self._offset |
| 1110 | |
| 1111 | if buff_offset >= 0 and buff_offset < len(self._readbuffer): |
| 1112 | # Just move the _offset index if the new position is in the _readbuffer |
| 1113 | self._offset = buff_offset |
| 1114 | read_offset = 0 |
| 1115 | elif read_offset < 0: |
| 1116 | # Position is before the current position. Reset the ZipExtFile |
| 1117 | self._fileobj.seek(self._orig_compress_start) |
| 1118 | self._running_crc = self._orig_start_crc |
| 1119 | self._compress_left = self._orig_compress_size |
| 1120 | self._left = self._orig_file_size |
| 1121 | self._readbuffer = b'' |
| 1122 | self._offset = 0 |
| 1123 | self._decompressor = _get_decompressor(self._compress_type) |
| 1124 | self._eof = False |
| 1125 | read_offset = new_pos |
| 1126 | if self._decrypter is not None: |
| 1127 | self._init_decrypter() |
| 1128 | |
| 1129 | while read_offset > 0: |
| 1130 | read_len = min(self.MAX_SEEK_READ, read_offset) |
| 1131 | self.read(read_len) |
| 1132 | read_offset -= read_len |
| 1133 | |
| 1134 | return self.tell() |
| 1135 | |
| 1136 | def tell(self): |
| 1137 | if self.closed: |
no test coverage detected