Two strings can look like the same pair of lines in an editor while containing different separators. Python’s str.splitlines recognizes several text boundaries. That is convenient for human text, but a parser should know whether those extra boundaries belong to its input format.
A Unicode line separator makes the difference visible:
text = "first\u2028second"
print(text.split("\n")) # ['first\u2028second']
print(text.splitlines()) # ['first', 'second']
The first operation looks for one explicit delimiter. The second applies the method’s broader line-boundary rule. The string reference lists the recognized boundaries and the optional keepends argument.
For a text-cleaning screen, treating a pasted line separator as a new line can be exactly what the reader expects. For a network protocol or a record format with a precisely defined delimiter, accepting extra separators may change the meaning of a field. Choose the splitting rule from the format’s specification rather than from whichever output looks tidiest in a quick demonstration.
Trailing separators are another useful test. Splitting a string ending with a newline on that literal delimiter produces an additional empty element. Splitlines does not manufacture an extra final line solely because the text ends at a line boundary. It also returns an empty list for an empty string. Code that uses the number of returned elements as a record count must account for these decisions.
There can still be genuine blank lines between two boundaries. A configuration parser should decide whether such lines are meaningful, ignored, or invalid. Blindly removing every empty result can conceal a missing value in a format where position matters. A data-cleaning operation and a validator have different jobs.
Decoding bytes is a separate stage. A bytes object and a Unicode string have different splitlines contracts, so do not assume a change from binary reading to text reading preserves every possible boundary. Establish the encoding and the delimiter policy together when the file format defines both.
A small fixture should include an empty input, one trailing newline, a blank line between records, and one unusual separator. The purpose is to record the intended interpretation before a later cleanup refactor changes it.
Use splitlines when its text-oriented boundaries match the job. When the input contract names a particular sequence of characters, parse that sequence deliberately and report unexpected alternatives instead of silently treating them as equivalent.

The Campfire
CommentsThanks. Your comment is waiting for the desk. Once it is approved it appears here within about a minute.
Add a comment