什么是os.linesep?

时间:2016-06-28 11:20:12

标签: python file-io separator platform-independent

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

  

在编写以文本模式打开的文件时,不要使用os.linesep作为行终止符(默认值);在所有平台上使用单个'\ n'。

Docs

Previous questions已经探讨了不应该在此上下文中使用它的原因,但是它有什么用处?什么时候应该使用行分隔符,以及什么?

2 个答案:

答案 0 :(得分:12)

  

文档明确表示在写入文件时不使用它

这不完全正确,医生说不要在文字模式下使用它。

当您想要遍历文本文件的行时,使用<List headerText="Positions" items="{/Positions}"> <ObjectListItem title="{id}"> </ObjectListItem> </List> 。内部扫描程序识别os.linesep并将其替换为单个&#34; \ n&#34;。

为了说明,我们编写了一个二进制文件,其中包含由&#34; \ r \ n&#34;分隔的3行。 (Windows分隔符):

os.linesep

二进制文件的内容是:

import io

filename = "text.txt"

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

注意:我使用了&#34; rb&#34;模式将文件读取为二进制文件。

我明白了:

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

如果我使用文本模式读取文件的内容,请执行以下操作:

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))

分隔符由&#34; \ n&#34;。

替换

'line1\n' 'line2\n' 'line3' 也用于写入模式:任何&#34; \ n&#34;字符转换为系统默认行分隔符:&#34; \ r \ n&#34;在Windows上,&#34; \ n&#34;在POSIX等。

使用os.linesep功能,您可以强制行分隔符为您想要的任何内容。

示例:如何编写Windows文本文件:

io.open

如果您在文本模式下阅读此文件,请执行以下操作:

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))

答案 1 :(得分:5)

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