我认为这应该可行:
file = open('filename.ppm', 'wb')
file.write('upper\nlower'.encode(encoding='ascii'))
运行代码时,尽管没有换行符;
用记事本打开时,filename.pmm
包含“ upperlower”。
答案 0 :(得分:5)
在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
答案 1 :(得分:2)
当您以 binary 模式('wb'
)写入文件时,Python会精确地 写入您提供的字节。因此,即使您编写'foo\nbar'
,也要写入磁盘-即使'\n'
在运行代码的平台上未被识别为换行标记。
如果您以 text 模式('w'
)写入文件,Python会convert '\n'
到运行代码的平台的相应换行标记,只要您不设置newline
参数:
将输出写入流时,如果换行符为None,则写入的所有\ n字符都将转换为系统默认的行分隔符os.linesep。如果换行符是''或'\ n',则不会进行翻译。如果换行符是其他任何合法值,则所有写入的'\ n'字符都将转换为给定的字符串。
答案 2 :(得分:1)
Windows使用\r\n
代表换行符,而Linux仅使用\n
。添加\r
回车符以查看记事本中的换行符。
file.write('upper\r\nlower')