os.linesep 用于什么?

33
Python的os模块包含一个特定于平台的字符串分隔符的值,但文档明确指出在写入文件时不要使用它:

“不要在文本模式下(默认情况下)写入文件时使用os.linesep作为行终止符;在所有平台上都应该使用单个'\n'。”
文档
之前的问题(链接)已经探讨了为什么在这种情况下不应该使用它,那么它有什么用呢?在什么情况下应该使用这个行分隔符?
2个回答

22

文档明确说明在写文件时不要使用它

并非完全如此。文档说的是不要在文本模式下使用它。

当你想迭代文本文件的每一行时,可以使用os.linesep。内部扫描器会识别os.linesep并将其替换为一个单独的\n

为了举例说明,我们编写一个包含3个行(使用\r\n作为Windows分隔符)的二进制文件:

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))
< p >< em >注意:我使用< code >"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,在POSIX 上为\n等。

使用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'

7

正如您所知,在 Python 中以文本模式读写文件会将平台特定的行分隔符转换为 '\n',反之亦然。但是如果您以二进制模式读取文件,则不会进行任何转换。然后您可以使用 string.replace(os.linesep, '\n') 显式地转换行结束符。如果文件(或流或其他)包含二进制和文本数据的组合,则这可能非常有用。


如果编码不兼容ASCII,则无法正常工作。len('\n'.encode('utf-16')) 为4。 - Nizam Mohamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接