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! -- http://mail.python.org/mailman/listinfo/python-list