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

Python open函数读取UTF-8文件报错 应使用哪种编码?

Python Windows环境UTF-8文件读取编码异常问题解答

注:你提供的最小复现脚本存在笔误,打开文件的变量名为f,调用readline()的变量写为了r,实际运行时需要修正。

import sys

print(sys.getdefaultencoding())

f = open("input.txt", "r")
# 原代码笔误为r.readline(),修正为:
f.readline()

为什么sys.getdefaultencoding()返回utf-8,open函数却用cp1252解码

sys.getdefaultencoding() 和文本文件打开的默认编码是两个完全独立的配置,没有关联:

  • sys.getdefaultencoding() 是Python运行时内部做字符串和字节串互转的默认编码,所有Python 3环境默认都是utf-8,和操作系统配置无关。
  • Python 3.10之前的Windows发行版,open() 函数打开文本文件时如果未指定encoding参数,默认会读取Windows系统ANSI代码页作为解码编码,cp1252就是西语区域Windows的默认ANSI代码页,和Python内部的默认编码没有关联。

不同设备表现不一致的可能原因(除Python补丁版本外)

  • 系统区域配置不同:运行正常的设备可能开启了Windows Beta版UTF-8支持(配置路径:控制面板→区域→管理→更改系统区域设置→勾选「使用 Unicode UTF-8 提供全球语言支持」),开启后系统ANSI代码页会变为65001(即UTF-8),open() 会默认采用UTF-8解码文件,不会触发错误。
  • 环境变量配置不同:运行正常的设备可能配置了PYTHONIOENCODING=utf-8 或者 PYTHONUTF8=1 环境变量,这两个变量会强制修改Python的默认文本编码为UTF-8。
  • 脚本执行上下文不同:如果脚本是通过不同的终端、调度工具或容器触发的,部分运行环境会修改进程的默认编码配置,也会导致两台设备表现不同。

为什么右引号不在第一行也会触发报错

Python读取文本文件默认启用块缓冲机制,调用readline()时会先读取一块固定大小(通常为4KB/8KB)的文件内容到内存解码,哪怕你只需要读取第一行,同缓冲块内的后续内容也会被提前解码,所以哪怕右引号不在第一行,只要落在第一个读取的缓冲块内就会触发解码异常。

无需修改代码/文件的修复方案

如果无法修改读取文件的外部软件,也不想修改原文件内容,可以通过以下两种方式修复:

  1. 开启Windows Beta版UTF-8支持,重启设备后生效
  2. 在启动外部软件前,给当前进程设置环境变量PYTHONUTF8=1,会强制Python使用UTF-8作为默认文本编码。

内容的提问来源于stack exchange,提问作者Dmitry Kuzminov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:09:05