Python文件编码统一方案_跨系统说明【指导】

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残留

不复杂但容易忽略