What is os.linesep for? What is os.linesep for? python python

What is os.linesep for?


the docs explicitly say not to use it when writing to a file

This is not exact, the doc says not to used it in text mode.

The os.linesep is used when you want to iterate through the lines of a text file. The internal scanner recognise the os.linesep and replace it by a single "\n".

For illustration, we write a binary file which contains 3 lines separated by "\r\n" (Windows delimiter):

import iofilename = "text.txt"content = b'line1\r\nline2\r\nline3'with io.open(filename, mode="wb") as fd:    fd.write(content)

The content of the binary file is:

with io.open(filename, mode="rb") as fd:    for line in fd:        print(repr(line))

NB: I used the "rb" mode to read the file as a binary file.

I get:

b'line1\r\n'b'line2\r\n'b'line3'

If I read the content of the file using the text mode, like this:

with io.open(filename, mode="r", encoding="ascii") as fd:    for line in fd:        print(repr(line))

I get:

'line1\n''line2\n''line3'

The delimiter is replaced by "\n".

The os.linesep is also used in write mode: any "\n" character is converted to the system default line separator: "\r\n" on Windows, "\n" on POSIX, etc.

With the io.open function you can force the line separator to whatever you want.

Example: how to write a Windows text file:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd:    fd.write("one\ntwo\nthree\n")

If you read this file in text mode like this:

with io.open(filename, mode="rb") as fd:    content = fd.read()    print(repr(content))

You get:

b'one\r\ntwo\r\nthree\r\n'


As you know, reading and writing files in text mode in python converts the platform specific line separator to '\n' and vice versa. But if you would read a file in binary mode, no conversion takes place. Then you can explicitly convert the line endings using string.replace(os.linesep, '\n'). This can be useful if a file (or stream or whatever) contains a combination of binary and text data.