Python在Windows中插入'\n'时会插入'\r\n'吗?
我在家用的是PC,工作时用的是Mac。之前我在写Python脚本或者输出结果时从来没有遇到过换行的问题,但每次给老板发东西的时候,他总是发邮件过来抱怨里面有Windows的换行符。
最近一次是我运行了一个Python脚本,我让它每行结束时加上'\n',但在我工作时的Mac上仔细一看,发现每行其实是以'\r\n'结束的。
这是怎么回事,我该怎么解决呢?我之前在家用Linux虚拟机运行所有脚本,但觉得那太慢了,也太麻烦了,难道没有更简单的办法吗?
2 个回答
你看到的这种情况并不是Python特有的。这是因为Python和其他高级语言底层使用的C标准库中的文件处理函数的行为。默认情况下,当写入文件时,它会把换行符转换成当前平台所使用的文本文件换行格式;而在读取时则会反过来处理。想了解更多细节,可以查看你本地系统上关于 fopen()
的文档。在Windows系统上,这意味着写入时\n会被转换成\r\n。
Python的文档中提到过换行符转换和其他 open()
模式选项,可以在 这里 找到相关信息。
一个解决办法是在打开输出文件时使用 open("filename", "wb")
而不是 open("filename", "w")
。这样可以避免自动的换行符转换。这应该能解决你老板的问题,只要他使用的是某种Unix系统(包括OSX)。不过,这样做也意味着一些Windows文本编辑器(比如记事本)可能会奇怪地显示你的文件:
Windows acts like a teletype when it sees new lines without carriage returns.
另一种方法是在把文件发送给不使用Windows的人之前,先根据需要转换文件。为此,有各种转换程序,比如 dos2unix
和 flip
。
这是因为你打开的文件是以文本模式进行的,而Python会根据你使用的平台来调整换行符(Windows使用\r\n
,而Linux只用\n
)。你需要像这样以二进制模式打开文件:
f = open("myfile.txt","wb")
当你读取文件时,它会反向处理(\r\n
会被替换成\n
),除非你也指定使用二进制模式:
f = open("myfile.txt", "rb")