Python文件编码必须统一使用UTF-8(无BOM),因其可避免跨平台乱码、SyntaxError及shebang识别异常;VS Code等编辑器需手动选“UTF-8”而非“UTF-8 with BOM”;Python 3无需coding声明;读写外部文件须显式指定encoding='utf-8'。

Python文件编码应统一使用UTF-8(无BOM),这是跨Windows、macOS、Linux系统稳定运行的关键前提。只要源码文件本身保存为UTF-8且明确声明,Python 3会默认按此解析,避免中文乱码、SyntaxError或读写异常。
为什么必须用UTF-8(无BOM)?
Windows记事本默认保存为UTF-8 with BOM,而Python解释器(尤其3.8+)在读取带BOM的.py文件时,可能将U+FEFF误认为非法字符,引发SyntaxError: Non-UTF-8 code starting with '\xef'。Linux/macOS终端原生支持UTF-8,但BOM仍属冗余字节,可能干扰shebang(如#!/usr/bin/env python3)识别。无BOM的UTF-8是POSIX与Python官方文档明确推荐的标准。
如何确保文件保存为UTF-8(无BOM)?
- VS Code:右下角点击编码名称(如“UTF-8”或“UTF-8 with BOM”)→ 选“Save with Encoding” → 选“UTF-8”(注意不是“UTF-8 with BOM”)
- PyCharm:File → Settings → Editor → File Encodings → 全局/项目/默认编码均设为“UTF-8”,勾选“Transparent native-to-ascii conversion”(对properties等文件有用,.py无需)
- Sublime Text:File → Save with Encoding → UTF-8
- Notepad++:编码 → 转为UTF-8无BOM格式 → 保存
是否需要写# -*- coding: utf-8 -*-?
Python 3.0+默认源码编码即为UTF-8,只要文件本身是UTF-8(无BOM),无需任何coding声明。加上该声明反而可能掩盖BOM问题(例如文件实际是UTF-8 with BOM,但声明了utf-8,解释器仍会报错)。仅当使用非UTF-8编码(极不推荐)时才需声明,日常开发中应完全省略。
处理文本文件读写时的编码意识
源码编码统一只是基础,读写外部文件(如txt、csv、json)时必须显式指定encoding='utf-8':
立即学习“Python免费学习笔记(深入)”;
-
正确:
with open('data.txt', encoding='utf-8') as f: -
错误:
with open('data.txt') as f:(依赖系统默认编码,Windows是gbk,Linux/macOS是UTF-8,必然跨平台失败) - JSON模块默认用UTF-8,但
json.load()和json.dump()仍建议传入encoding='utf-8'参数(Python 3.9+已弃用该参数,直接用文本模式即可)
检查与验证方法
快速确认.py文件是否合规:
- 用
file -i filename.py(Linux/macOS)查看编码类型 - 用
xxd filename.py | head检查开头是否含ef bb bf(即BOM) - 在Python中执行
python -m py_compile filename.py,若报SyntaxError且提示非UTF-8字符,大概率是BOM残留
不复杂但容易忽略










