【问题标题】:How to write ascii encoded newline character to a file with python如何使用 python 将 ascii 编码的换行符写入文件
【发布时间】:2020-01-22 23:24:53
【问题描述】:

我认为这应该可行:

file = open('filename.ppm', 'wb')
file.write('upper\nlower'.encode(encoding='ascii'))

当我运行代码时,虽然没有换行; filename.pmm 使用记事本打开时包含“upperlower”。

【问题讨论】:

  • 什么都没有,读作upperlower。代码运行后我用记事本打开文件。
  • 可以去掉编码部分吗?尽管如此,这应该是正确的方法:stackoverflow.com/questions/2918362/…
  • 它给出了一个 TypeError 说一个字节对象是必需的。

标签: python character-encoding ascii


【解决方案1】:

open()中指定编码:

>>> with open("filename.ppm", "w", encoding="ascii") as f:
...     f.write("upper\nlower")

$ cat filename.ppm
upper
lower $

open() 函数的文档可能提供了一些线索,说明您当前的方法为何会提供您未曾预料到的东西。

首先,关于换行符和\n\r\n

将输出写入流时,如果换行符为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果换行符是 '' 或 '\n',则不进行翻译。如果换行符是任何其他合法值,则写入的任何 '\n' 字符都将转换为给定的字符串。

我的猜测是,在您的情况下,由于您将 bytes 写入输出流,因此在将“原始”字节写入文件时可能不会发生这种转换。

最后值得一提的是encoding="ascii" 的使用。在这种情况下,这实际上并不重要,因为 ASCII 是 Unicode 的一个子集,所有字符都在 ASCII 范围内。

>>> all(i.isascii() for i in "upper\nlower")
True

【讨论】:

    【解决方案2】:

    Windows 使用\r\n 表示新行,而Linux 只使用\n。添加\r 回车以查看记事本中的换行符。

    file.write('upper\r\nlower')
    

    【讨论】:

      【解决方案3】:

      当您以 二进制 模式 ('wb') 写入文件时,Python 准确地 写入您提供的字节。因此,如果您编写 'foo\nbar',这就是写入磁盘的内容 - 即使 '\n' 在运行您的代码的平台上未被识别为换行符。

      如果您以 text 模式 ('w') 写入文件,Python 将 convert '\n' 到运行代码的平台的相应换行符,只要您不这样做'不设置newline参数:

      将输出写入流时,如果换行符为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果换行符是 '' 或 '\n',则不进行翻译。如果换行符是任何其他合法值,则写入的任何 '\n' 字符都将转换为给定的字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-27
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        相关资源
        最近更新 更多