Canonical way of dealing with null-separated lines?

John Machin sjmachin at lexicon.net
Tue Mar 1 19:10:10 EST 2005


Douglas Alan wrote:
> "John Machin" <sjmachin at lexicon.net> writes:
>
> >>        lines = (partialLine + charsJustRead).split(newline)
>
> > The above line is prepending a short string to what will typically
be a
> > whole buffer full. There's gotta be a better way to do it.
>
> If there is, I'm all ears.  In a previous post I provided code that
> doesn't concatinate any strings together until the last possible
> moment (i.e. when yielding a value).  The problem with that the code
> was that it was complicated and didn't work right in all cases.
>
> One way of solving the string concatination issue would be to write a
> string find routine that will work on lists of strings while ignoring
> the boundaries between list elements.  (I.e., it will consider the
> list of strings to be one long string for its purposes.)  Unless it
is
> written in C, however, I bet it will typically be much slower than
the
> code I just provided.
>
> > Perhaps you might like to refer back to CdV's solution which was
> > prepending the residue to the first element of the split() result.
>
> The problem with that solution is that it doesn't work in all cases
> when the line-separation string is more than one character.
>
> >>        for line in lines: yield line + outputLineEnd
>
> > In the case of leaveNewline being false, you are concatenating an
empty
> > string. IMHO, to quote Jon Bentley, one should "do nothing
gracefully".
>
> In Python,
>
>    longString + "" is longString
>
> evaluates to True.  I don't know how you can do nothing more
> gracefully than that.

And also "" + longString is longString

The string + operator provides those graceful *external* results by
ugly special-case testing internally.

It is not graceful IMHO to concatenate a variable which you already
know refers to a null string.

Let's go back to the first point, and indeed further back to the use
cases:

(1) multi-byte separator for lines in test files: never heard of one
apart from '\r\n'; presume this is rare, so test for length of 1 and
use Chris's simplification of my effort in this case.

(2) keep newline: with the standard file reading routines, if one is
going to do anything much with the line other than write it out again,
one does buffer = buffer.rstrip('\n') anyway. In the case of a
non-standard separator, one is likely to want to write the line out
with the standard '\n'. So, specialisation for this is indicated:

! if keepNewline:
!     for line in lines: yield line + newline
! else:
!     for line in lines: yield line

Cheers,
John




More information about the Python-list mailing list