Scanning a file
Alex Martelli
aleaxit at yahoo.com
Sat Oct 29 14:23:25 EDT 2005
Bengt Richter <bokr at oz.net> wrote:
...
> >>> while block:
> >>> block = block[-overlap:] + f.read(blocksize-overlap)
> >>> if block: yield block
...
> I was thinking this was an example a la Alex's previous discussion
> of interviewee code challenges ;-)
>
> What struck me was
>
> >>> gen = byblocks(StringIO.StringIO('no'),1024,len('end?')-1)
> >>> [gen.next() for i in xrange(10)]
> ['no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no']
Heh, OK, I should get back into the habit of adding a "warning: untested
code" when I post code (particularly when it's late and I'm
jetlagged;-). The code I posted will never exit, since block always
keeps the last overlap bytes; it needs to be changed into something like
(warning -- untested code!-)
if overlap>0:
while True:
next = f.read(blocksize-overlap)
if not next: break
block = block[-overlap:] + next
yield block
else:
while True:
next = f.read(blocksize)
if not next: break
yield next
(the if/else is needed to handle requests for overlaps <= 0, if desired;
I think it's clearer to split the cases rather than to test inside the
loop's body).
Alex
More information about the Python-list
mailing list