Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7bb11d6

Browse files
committed
Sjoerd Mullender:
Added support for unseekable files. (I use unqualified excepts since we don't know why the seek/tell might fail. In my case it was because of an AttributeError.)
1 parent f2f0594 commit 7bb11d6

1 file changed

Lines changed: 24 additions & 8 deletions

File tree

Lib/chunk.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ def __init__(self, file, align = 1):
6363
raise EOFError
6464
self.chunksize = self.chunksize - 8 # subtract header
6565
self.size_read = 0
66-
self.offset = self.file.tell()
66+
try:
67+
self.offset = self.file.tell()
68+
except:
69+
self.seekable = 0
70+
else:
71+
self.seekable = 1
6772

6873
def getname(self):
6974
"""Return the name (ID) of the current chunk."""
@@ -87,6 +92,8 @@ def seek(self, pos, mode = 0):
8792

8893
if self.closed:
8994
raise ValueError, "I/O operation on closed file"
95+
if not self.seekable:
96+
raise IOError, "cannot seek"
9097
if mode == 1:
9198
pos = pos + self.size_read
9299
elif mode == 2:
@@ -133,11 +140,20 @@ def skip(self):
133140

134141
if self.closed:
135142
raise ValueError, "I/O operation on closed file"
136-
try:
137-
self.file.seek(self.chunksize - self.size_read, 1)
138-
except RuntimeError:
139-
while self.size_read < self.chunksize:
140-
dummy = self.read(8192)
141-
if not dummy:
142-
raise EOFError
143+
if self.seekable:
144+
try:
145+
n = self.chunksize - self.size_read
146+
# maybe fix alignment
147+
if self.align and (self.chunksize & 1):
148+
n = n + 1
149+
self.file.seek(n, 1)
150+
self.size_read = self.size_read + n
151+
return
152+
except:
153+
pass
154+
while self.size_read < self.chunksize:
155+
n = min(8192, self.chunksize - self.size_read)
156+
dummy = self.read(n)
157+
if not dummy:
158+
raise EOFError
143159

0 commit comments

Comments
 (0)