Python 2 文件编码声明设置与 sys.setdefaultencoding 详解

键盘旁的猫
键盘旁的猫
发布时间:2026-10-13| 3人浏览过
原创

本文详解 Python 2 中设置文件编码格式的方法,包括文件头部的编码声明写法及其作用。重点解析为何需要 reload(sys) 来恢复 setdefaultencoding 函数,以及当默认编码为 ASCII 导致解码错误时的两种修正方案:显式指定编码或修改系统默认编码。

在 Python 2 的源代码文件中编写中文内容时,必须添加一行声明文件编码的注释,否则解释器会默认采用 ASCII 编码进行解析。(注:Python 3 已解决此问题,默认文件编码即为 UTF-8)。

编码声明注释必须放置在文件的第一行或第二行。通常,Python 文件的前两行应如下编写:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

其中第一行用于指定 Python 解释器的路径,第二行用于指定 Python 文件的编码方式。设置编码方式有以下几种可选写法:

1. 使用等号的设置方法:

#!/usr/bin/python
# coding=<encoding name>

2. 最常见的带冒号写法(大多数编辑器均可正确识别):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

3. Vim 编辑器的写法:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

在文件头部设置编码声明主要有以下几个作用:

如果代码中包含中文注释,则必须添加此声明以确保正确解析。

部分高级编辑器(如 Emacs)会根据头部声明,将该编码作为代码文件的格式标准。

程序会通过头部声明来解码初始化 Unicode 对象(例如 u”人生苦短”),因此头部声明指定的编码必须与代码文件的实际存储格式保持一致。

此外,该声明还用于设置默认解码格式。

import sys  #引用sys模块进来,并不是进行sys的第一次加载 
reload(sys) #重新加载sys 
sys.setdefaultencoding('utf8') ##调用setdefaultencoding函数

这里需要特别注意第二行中的 reload(sys) 语句,这一步绝对不能省略,否则代码无法正确运行。为什么要重新加载 sys 模块,而直接 import 却无效呢?因为 setdefaultencoding 函数在系统初始化调用后被删除了,所以通过 import 引入时该函数已不存在,必须通过 reload 重新加载 sys 模块,才能使 setdefaultencoding 可用,从而在代码中修改解释器当前的字符编码。

在 Python 安装目录的 Lib 文件夹下,存在一个名为 site.py 的文件。在该文件中可以找到 main() -> setencoding() -> sys.setdefaultencoding(encoding) 的执行链。由于 site.py 在每次启动 Python 解释器时会自动加载,因此 main 函数每次都会被执行,导致 setdefaultencoding 函数在创建后随即被删除。

关于 sys.defaultencoding,它在解码操作未明确指明解码方式时被使用。例如以下代码:

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = '中文' # 注意这里的 str 是 str 类型的,而不是 unicode 
s.encode('gb18030') 

该语句将字符串 s 重新编码为 gb18030 格式,即执行从 unicode 到 str 的转换。由于 s 本身是 str 类型,因此:

Python 会自动先将 s 解码为 unicode,然后再编码成 gb18030。由于解码过程由 Python 自动执行且未指明解码方式,Python 会使用 sys.defaultencoding 指定的方式进行解码。在很多情况下,sys.defaultencoding 的值为:

ASCII。如果 s 的编码不是 ASCII,程序就会报错。以上述情况为例,我的 sys.defaultencoding 是 ASCII,而 s 的编码方式与文件编码一致,为 UTF-8,因此出现错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
0: ordinal not in range(128) 

针对这种情况,有两种修正方法:

第一种方法是明确指示 s 的编码方式:

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = '中文' 
s.decode('utf-8').encode('gb18030') 

第二种方法是更改 sys.defaultencoding 为文件的编码方式:

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys 
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 
sys.setdefaultencoding('utf-8') 
str = '中文' 
str.encode('gb18030')

以上关于 Python 设置文件编码格式的实现方法即为全部内容,希望能对读者有所帮助,也欢迎大家继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。