docs wyraźnie powiedzieć nie go używać podczas pisania do pliku
To nie jest dokładny, doc mówi, aby nie stosować go w trybie tekstowym.
Urządzenie os.linesep
jest używane do iteracji po liniach pliku tekstowego. Wewnętrzny skaner rozpoznaje os.linesep
i zastępuje go pojedynczym "\ n".
Dla ilustracji napisać pliku binarnej, który zawiera 3 linie rozdzielone "\ r \ n" (Windows ogranicznika)
import io
filename = "text.txt"
content = b'line1\r\nline2\r\nline3'
with io.open(filename, mode="wb") as fd:
fd.write(content)
zawartość pliku binarnym:
with io.open(filename, mode="rb") as fd:
for line in fd:
print(repr(line))
NB: Użyłem trybu "rb", aby odczytać plik jako plik binarny.
uzyskać:
b'line1\r\n'
b'line2\r\n'
b'line3'
Gdybym odczytać zawartość pliku przy użyciu trybu tekstowego, tak:
with io.open(filename, mode="r", encoding="ascii") as fd:
for line in fd:
print(repr(line))
uzyskać:
'line1\n'
'line2\n'
'line3'
Separator zastępuje się "\ n".
os.linesep
stosowany jest również w trybie zapisu: dowolny znak "\ n" jest konwertowany do standardowego układu separatora wiersza: "\ r \ n" na Windows, "\ n" na POSIX, itp
Dzięki funkcji io.open
możesz wymusić separator linii na dowolne życzenie.
Przykład: jak napisać pliku Windows tekst:
with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd:
fd.write("one\ntwo\nthree\n")
Jeśli czytasz ten plik w trybie tekstowym jak poniżej:
with io.open(filename, mode="rb") as fd:
content = fd.read()
print(repr(content))
otrzymasz:
b'one\r\ntwo\r\nthree\r\n'
To Wouldn Działa, jeśli kodowanie jest niezgodne z ASCII. 'len ('\ n'.encode (' utf-16 '))' wynosi 4 –