os.linesep 有什么用?
What is os.linesep for?
Python 的 os 模块包含一个平台特定行分隔字符串的值,但文档明确表示在写入文件时不要使用它:
Do not use os.linesep as a line terminator when writing files opened in text mode (the default); use a single '\n' instead, on all platforms.
Previous questions 已经探讨了为什么您 不应该 在这种情况下使用它,但是它在什么情况下有用?什么时候应该使用行分隔符?为了什么?
如您所知,在 python 中以文本模式读写文件会将平台特定的行分隔符转换为“\n”,反之亦然。但是如果您以二进制模式读取文件,则不会发生任何转换。然后您可以使用 string.replace(os.linesep, '\n')
显式转换行尾。如果文件(或流或其他)包含二进制和文本数据的组合,这将很有用。
the docs explicitly say not to use it when writing to a file
这不准确,文档说不要在 text 模式下使用它。
当您想遍历文本文件的行时使用os.linesep
。内部扫描器识别 os.linesep
并将其替换为单个“\n”。
为了说明,我们编写了一个二进制文件,其中包含由“\r\n”(Windows 定界符)分隔的 3 行:
import io
filename = "text.txt"
content = b'line1\r\nline2\r\nline3'
with io.open(filename, mode="wb") as fd:
fd.write(content)
二进制文件内容为:
with io.open(filename, mode="rb") as fd:
for line in fd:
print(repr(line))
注意:我使用"rb"模式将文件作为二进制文件读取。
我得到:
b'line1\r\n'
b'line2\r\n'
b'line3'
如果我使用文本模式读取文件内容,像这样:
with io.open(filename, mode="r", encoding="ascii") as fd:
for line in fd:
print(repr(line))
我得到:
'line1\n'
'line2\n'
'line3'
分隔符替换为“\n”。
os.linesep
也用于写入模式:任何“\n”字符都转换为系统默认的行分隔符:Windows上的“\r\n”、“\n " 在 POSIX 等
使用 io.open
函数,您可以强制使用任何您想要的行分隔符。
示例:如何编写 Windows 文本文件:
with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd:
fd.write("one\ntwo\nthree\n")
如果您像这样以文本模式阅读此文件:
with io.open(filename, mode="rb") as fd:
content = fd.read()
print(repr(content))
你得到:
b'one\r\ntwo\r\nthree\r\n'
Python 的 os 模块包含一个平台特定行分隔字符串的值,但文档明确表示在写入文件时不要使用它:
Do not use os.linesep as a line terminator when writing files opened in text mode (the default); use a single '\n' instead, on all platforms.
Previous questions 已经探讨了为什么您 不应该 在这种情况下使用它,但是它在什么情况下有用?什么时候应该使用行分隔符?为了什么?
如您所知,在 python 中以文本模式读写文件会将平台特定的行分隔符转换为“\n”,反之亦然。但是如果您以二进制模式读取文件,则不会发生任何转换。然后您可以使用 string.replace(os.linesep, '\n')
显式转换行尾。如果文件(或流或其他)包含二进制和文本数据的组合,这将很有用。
the docs explicitly say not to use it when writing to a file
这不准确,文档说不要在 text 模式下使用它。
当您想遍历文本文件的行时使用os.linesep
。内部扫描器识别 os.linesep
并将其替换为单个“\n”。
为了说明,我们编写了一个二进制文件,其中包含由“\r\n”(Windows 定界符)分隔的 3 行:
import io
filename = "text.txt"
content = b'line1\r\nline2\r\nline3'
with io.open(filename, mode="wb") as fd:
fd.write(content)
二进制文件内容为:
with io.open(filename, mode="rb") as fd:
for line in fd:
print(repr(line))
注意:我使用"rb"模式将文件作为二进制文件读取。
我得到:
b'line1\r\n'
b'line2\r\n'
b'line3'
如果我使用文本模式读取文件内容,像这样:
with io.open(filename, mode="r", encoding="ascii") as fd:
for line in fd:
print(repr(line))
我得到:
'line1\n'
'line2\n'
'line3'
分隔符替换为“\n”。
os.linesep
也用于写入模式:任何“\n”字符都转换为系统默认的行分隔符:Windows上的“\r\n”、“\n " 在 POSIX 等
使用 io.open
函数,您可以强制使用任何您想要的行分隔符。
示例:如何编写 Windows 文本文件:
with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd:
fd.write("one\ntwo\nthree\n")
如果您像这样以文本模式阅读此文件:
with io.open(filename, mode="rb") as fd:
content = fd.read()
print(repr(content))
你得到:
b'one\r\ntwo\r\nthree\r\n'