Canonical way of dealing with null-separated lines?

Christopher De Vries devries at idolstarastronomer.com
Thu Feb 24 16:51:22 EST 2005


On Fri, Feb 25, 2005 at 07:56:49AM +1100, John Machin wrote:
> Try this:
> !def readweird(f, line_end='\0', bufsiz=8192): 
> !    retain = '' 
> !    while True: 
> !        instr = f.read(bufsiz)
> !        if not instr:
> !            # End of file 
> !            break 
> !        splitstr = instr.split(line_end)
> !        if splitstr[-1]:
> !            # last piece not terminated
> !            if retain:
> !                splitstr[0] = retain + splitstr[0]
> !            retain = splitstr.pop()
> !        else:
> !            if retain:
> !                splitstr[0] = retain + splitstr[0]
> !                retain = ''
> !            del splitstr[-1]
> !        for element in splitstr: 
> !            yield element 
> !    if retain:
> !        yield retain
> 

I think this is a definite improvement... especially putting the buffer size
and line terminators as optional arguments, and handling empty files. I think,
however that the if splitstr[-1]: ... else: ... clauses aren't necessary, so I
would probably reduce it to this:

!def readweird(f, line_end='\0', bufsiz=8192):
!    retain = ''
!    while True:
!        instr = f.read(bufsiz)
!        if not instr:
!            # End of file
!            break
!        splitstr = instr.split(line_end)
!        if retain:
!            splitstr[0] = retain + splitstr[0]
!        retain = splitstr.pop()
!        for element in splitstr:
!            yield element
!    if retain:
!        yield retain 

Popping off that last member and then iterating over the rest of the list as
you suggested is so much more efficient, and it looks a lot better. 

Chris



More information about the Python-list mailing list