如何阻止Windows下Python print()自动将换行转换为CRLF
在Windows CMD中让Python输出LF风格换行符的解决办法
兄弟,我太懂你碰到的这个坑了——在Windows CMD里用Python输出带LF的文本,结果一管道或者重定向到文件,就自动变成CRLF了对吧?其实这事儿根源在于Python在Windows环境下,默认把标准输出(stdout)当成文本模式来处理,会自动把单个的\n转换成Windows专属的\r\n(也就是CRLF,十六进制的0D 0A)。
下面给你几个亲测有效的解决办法,按需选就行:
方法一:直接用二进制流输出
绕过文本模式的自动转换,直接往stdout的缓冲区写二进制字节:
#!python3 #coding=utf-8 import sys # 先把版本信息转成二进制,加上LF换行 sys.stdout.buffer.write(sys.version.encode('utf-8') + b'\n') # 直接写入带LF的二进制字符串 sys.stdout.buffer.write(b"one\ntwo\n")
这样输出的每一个b'\n'都会被原样保留成LF(十六进制0A),不会被偷偷换成CRLF。
方法二:修改stdout为二进制模式
如果还是想用print函数输出,那可以先把stdout的模式改成二进制:
#!python3 #coding=utf-8 import sys import os # 只在Windows环境下执行修改 if sys.platform == 'win32': import msvcrt # 将stdout的文件描述符设为二进制模式 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) # 现在print输出的\n就会是LF了 print(sys.version) print("one\ntwo")
修改之后,后续所有print输出的换行符都会保持LF格式,完美适配管道或者重定向场景。
方法三:写文件时指定不转换换行符
如果你的需求是直接写入文件而不是管道输出,也可以在打开文件时加上newline=''参数:
#!python3 #coding=utf-8 import sys # newline='' 告诉Python不要自动转换换行符 with open('t.txt', 'w', encoding='utf-8', newline='') as f: f.write(sys.version + '\n') f.write("one\ntwo\n")
这样写入的\n会直接以LF的形式保存到文件里,不会被替换成CRLF。
你可以随便选一种方法试试,运行脚本后用十六进制编辑器查看输出文件,就能看到换行符都是0A啦。
内容的提问来源于stack exchange,提问作者handle
相关产品推荐
相关产品推荐

