You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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系统生成的文件,换行显示正常,每个子列表的内容写完后自动换行

差异原因

  1. 换行符标准差异:Windows默认用CRLF(\r\n,对应ASCII码0x0D+0x0A)作为换行标记,Linux则用LF(\n,对应ASCII码0x0A)。
  2. 文件打开模式影响:代码用二进制模式ab+打开文件,Python在二进制模式下不会自动转换换行符,写入的"\n"会直接以LF字节存入文件。
  3. 编辑器解析差异: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:13:07