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 "
".
For illustration, we write a binary file which contains 3 lines separated by "
" (Windows delimiter):
import io
filename = "text.txt"
content = b'line1
line2
line3'
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
'
b'line2
'
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
'
'line2
'
'line3'
The delimiter is replaced by "
".
The os.linesep
is also used in write mode: any "
" character is converted to the system default line separator: "
" on Windows, "
" 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="
") as fd:
fd.write("one
two
three
")
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
two
three
'