Python 2中file.writelines()处理Unicode在Windows与Linux结果不同的原因及解决
跨系统文件换行差异原因及解决方法
代码示例
import os filename = "text.txt" data = [ [ u"hello world1", u"hello world2", u"hello world3", ], [ u"hello world1", u"hello world2", u"hello world3", ], ] # remove file if exist if os.path.isfile(filename): os.remove(filename) with open(filename, "ab+") as f: for item in data: f.writelines(item) f.write("\n")
现象描述
- Windows系统生成的
text.txt文件,用原生文本编辑器打开时,换行位置会显示异常符号(如^M),内容无法正常换行 - Linux系统生成的文件,换行显示正常,每个子列表的内容写完后自动换行
差异原因
- 换行符标准差异:Windows默认用
CRLF(\r\n,对应ASCII码0x0D+0x0A)作为换行标记,Linux则用LF(\n,对应ASCII码0x0A)。 - 文件打开模式影响:代码用二进制模式
ab+打开文件,Python在二进制模式下不会自动转换换行符,写入的"\n"会直接以LF字节存入文件。 - 编辑器解析差异:Windows原生编辑器(如记事本)仅识别
CRLF为有效换行,单独的LF会被解析为异常符号;Linux编辑器默认支持LF换行,因此显示正常。
解决方法(Windows下生成Linux风格输出)
方法1:文本模式指定换行符
将文件打开方式改为文本模式a+,通过newline='\n'强制写入LF换行符,Python会自动处理编码和换行统一:
with open(filename, "a+", encoding='utf-8', newline='\n') as f: for item in data: f.writelines(item) f.write("\n")
方法2:二进制模式显式编码写入
若需保留二进制模式,需将Unicode字符串编码为字节串,直接写入LF字节(b'\n'):
with open(filename, "ab+") as f: for item in data: for content in item: f.write(content.encode('utf-8')) f.write(b'\n')
补充说明
如果只是希望在Windows下正常显示Linux风格换行的文件,也可以使用VS Code、Notepad++等支持LF换行的编辑器,这类工具会自动识别并正确显示。
内容的提问来源于stack exchange,提问作者chewing gum
相关产品推荐
相关产品推荐

