【问题标题】:How to write Unix end of line characters in Windows?如何在 Windows 中编写 Unix 行尾字符?
【发布时间】:2011-02-01 22:53:07
【问题描述】:

如何使用 Python(在 Windows 上)写入文件并使用 Unix 行尾字符?

例如做的时候:

f = open('file.txt', 'w') f.write('你好\n') f.close()

Python 会自动将 \n 替换为 \r\n

【问题讨论】:

    标签: python newline


    【解决方案1】:

    现代方式:使用 newline=''

    使用 newline= 关键字参数到 io.open() 以使用 Unix 样式的 LF 行尾终止符:

    import io
    f = io.open('file.txt', 'w', newline='\n')
    

    这适用于 Python 2.6+。在 Python 3 中,您还可以使用内置的 open() 函数的 newline= 参数而不是 io.open()

    老办法:二进制模式

    防止换行符转换的旧方法在 Python 3 中不起作用,即以 binary 模式打开文件以防止转换行尾字符:

    f = open('file.txt', 'wb')    # note the 'b' meaning binary
    

    但在 Python 3 中,二进制模式将读取 bytes 而不是 characters,因此它不会执行您想要的操作。当您尝试在流上执行字符串 I/O 时,您可能会遇到异常。 (例如“TypeError: 'str' 不支持缓冲区接口”)。

    【讨论】:

    • 这对我有帮助:# newline='' 表示不转换\n plus.google.com/+PongsametreySOK/posts/2Bg8AdNJCxV
    • 你可以直接将换行符设置为'\n',这个比''更明确,我觉得更容易阅读。
    • @12431234123412341234123 我同意,使用'\n''' 更清晰。然后我不需要评论来解释代码在做什么:) 但请注意,这仅适用于编写文件。读取文件时,newline='\n'newline='' 不完全相同,因为在前一种情况下,readlines() 只会在 \n 上拆分,但在使用 newline='' 时,它会进行通用换行处理,但仍会返回实际的换行符从数据中的文件。感谢您的建议! Python test program
    • Python 3.6+(也可能是以前的 Python3 版本)。如果您有点担心看到之前切换的相同'\n',您可以使用 Unicode 代码点(确保编码是 utf-8 或其他兼容的)。 with open('file.txt', 'w', encoding='utf-8', newline='\u000A') ;附言结果与newline='\n' 版本没有任何不同,这只是如果有人想要更多舒适。
    【解决方案2】:

    对于 Python 2 和 3

    请参阅:The modern way: use newline='' 此页面上的答案。

    仅适用于 Python 2(原始答案)

    以二进制形式打开文件以防止转换行尾字符:

    f = open('file.txt', 'wb')
    

    引用 Python 手册:

    在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,因此还有 'rb'、'wb' 和 'r+b' 等模式。 Windows 上的 Python 区分了文本文件和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍作更改。这种对文件数据的幕后修改适用于 ASCII 文本文件,但它会破坏 JPEG 或 EXE 文件中的二进制数据。在读写此类文件时要非常小心使用二进制模式。在 Unix 上,将 'b' 附加到模式并没有什么坏处,因此您可以独立于平台使用它来处理所有二进制文件。

    【讨论】:

      【解决方案3】:

      打开文件时需要使用二进制伪模式。

      f = open('file.txt', 'wb')
      

      【讨论】:

        猜你喜欢
        • 2011-12-25
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多