How to do this in Python?

Jim Garrison jhg at acm.org
Wed Mar 18 01:54:54 CET 2009


Tim Chase wrote:
>> Am I missing something basic, or is this the canonical way:
>>
>>      with open(filename,"rb") as f:
>>          buf = f.read(10000)
>>          while len(buf) > 0
>>              # do something....
>>              buf = f.read(10000)
> 
> That will certainly do.  Since read() should simply return a 0-length
> string when you're sucking air, you can just use the test "while buf"
> instead of "while len(buf) > 0".
> 
> However, if you use it multiple places, you might consider writing an
> iterator/generator you can reuse:
> 
>   def chunk_file(fp, chunksize=10000):
>     s = fp.read(chunksize)
>     while s:
>       yield s
>       s = fp.read(chunksize)
> 
>   with open(filename1, 'rb') as f:
>     for portion in chunk_file(f):
>       do_something_with(portion)
> 
>   with open(filename2, 'rb') as f:
>     for portion in chunk_file(f, 1024):
>       do_something_with(portion)
> 
> -tkc

Ah.  That's the Pythonesque way I was looking for.  I knew
it would be a generator/iterator but haven't got the Python
mindset down yet and haven't played with writing my own
generator.  I'm still trying to think in purely object-
oriented terms where I would override __next__() to
return a chunk of the appropriate size.

Give a man some code and you solve his immediate problem.
Show him a pattern and you've empowered him to solve
his own problems.  Thanks!



More information about the Python-list mailing list