【问题标题】:What is os.linesep for?os.linesep 是干什么用的?
【发布时间】:2016-10-30 16:45:44
【问题描述】:

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

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

Docs

Previous questions 探讨了为什么您不应该在这种情况下使用它,但它对什么情况有用?什么时候应该使用行分隔符?用于什么目的?

【问题讨论】:

    标签: python file-io separator platform-independent


    【解决方案1】:

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

    这不准确,文档说不要在 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”,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'
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果编码与 ascii 不兼容,它将无法工作。 len('\n'.encode('utf-16')) 是 4
      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2014-12-20
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多