Read data from the file.
(self, size=None)
| 680 | return self.position |
| 681 | |
| 682 | def read(self, size=None): |
| 683 | """Read data from the file. |
| 684 | """ |
| 685 | if size is None: |
| 686 | size = self.size - self.position |
| 687 | else: |
| 688 | size = min(size, self.size - self.position) |
| 689 | |
| 690 | buf = b"" |
| 691 | while size > 0: |
| 692 | while True: |
| 693 | data, start, stop, offset = self.map[self.map_index] |
| 694 | if start <= self.position < stop: |
| 695 | break |
| 696 | else: |
| 697 | self.map_index += 1 |
| 698 | if self.map_index == len(self.map): |
| 699 | self.map_index = 0 |
| 700 | length = min(size, stop - self.position) |
| 701 | if data: |
| 702 | self.fileobj.seek(offset + (self.position - start)) |
| 703 | b = self.fileobj.read(length) |
| 704 | if len(b) != length: |
| 705 | raise ReadError("unexpected end of data") |
| 706 | buf += b |
| 707 | else: |
| 708 | buf += NUL * length |
| 709 | size -= length |
| 710 | self.position += length |
| 711 | return buf |
| 712 | |
| 713 | def readinto(self, b): |
| 714 | buf = self.read(len(b)) |