On 01 Dec 2004 15:55:18 -0500, David Bolen <[EMAIL PROTECTED]> wrote: >Jp Calderone <[EMAIL PROTECTED]> writes: > > > def nonBlockingReadAll(fileObj): > > bytes = [] > > while True: > > b = fileObj.read(1024) > > bytes.append(b) > > if len(b) < 1024: > > break > > return ''.join(bytes) > > Wouldn't this still block if the input just happened to end at a > multiple of the read size (1024)?
Only if the file has not been put into non-blocking mode. But the function as given is wrong, I left out the exception handling in the case you mention. Rather than blocking forever, fileObj.read(1024) will raise IOError (EAGAIN) if the input happened to be a multiple of 1024 bytes long. Here is the corrected version: def nonBlockingReadAll(fileObj): bytes = [] while True: try: b = fileObj.read(1024) except IOError, e: if e.args[0] == errno.EAGAIN: break raise bytes.append(b) if len(b) < 1024: break return ''.join(bytes) Arguably, there is no longer any point to checking the length of b in this version, since at worst you will break on the next iteration of the loop. It doesn't hurt, though. Jp -- http://mail.python.org/mailman/listinfo/python-list