Python源代码文件的文本编码

源代码的编码问题对于任何语言的源文件都是存在的,只不过对于脚本语言,这个问题更突出一些。

有的人可能会说,既然源代码在文本编辑器中可以正常显示,说明编码没有问题,编辑器可以识别它,为什么Python还要求声明源代码的编码呢?

这是因为,明确地声明编码可以简化Python解释器的实现,免得它去猜测源文件的编码,这样既会增加解释器的复杂性,也会减慢程序的执行速度(毕竟是解释执行)。况且,程序运行必须是精确的,不能靠猜测。

从Python 2.3开始,可以在Python源文件中明确地声明字符编码,默认是7-bit ASCII编码。

字符编码声明是以在源文件第一行或者第二行出现的一个魔法注释来实现的:

# coding=<encoding name>

至于为什么必须是第一行或者第二行,这个很好解释:既然要解释一个文件,必须在最开始的时候就知道字符编码,但是在Unix/Linux平台上,第一行可能留给了Python解释器声明,#!/usr/bin/python,这也是一个魔法注释。

如果声明的编码Python解释器不认识,那么在编译阶段(对于CPython,这就是指将py文件转换成pyc文件)就会报错。

如果声明的编码与实际不符(就是说,文件实际上是以另外的编码保存的),出错的可能性很大,但是并非一定会出错,毕竟编码之间可能有一定的重叠。

如果没有声明源文件的编码,但是却使用了7-bit ASCII之外的字符,那么在编译(对于CPython,这就是指将py文件转换成pyc文件)的时候会出错,并且显示SyntaxError。

非7-bit ASCII字符大部分出现在字符串字面常量中,一些人会认为使用unicode字符串字面常量会解决编码的问题,但这完全是另一个层面上的问题,如果源文件的编码没有弄对,根本还到不了讨论unicode字符串那一步。

对于Windows平台而言,如果源文件是以utf-8格式存储的,它会在文件的开头加上BOM(Byte Order Mark),对于utf-8,这就是\xef\xbb\xbf,此时,无需对文件编码进行声明,如果要声明的话,也必须是utf-8,否则编译出错。

交互式输入窗口是有源文件编码的,允许输入中文,显然不是ascii。

Windows和Unix/Linux的换行符序列不相同,有的时候这也可能导致问题。

总之,如果编码有问题,编译时就会出错,如果运行时输出乱码,那应该是没有使用unicode字符串或者输出窗口不支持的缘故。

参考文档:

http://www.python.org/dev/peps/pep-0263/

http://bugs.python.org/issue526840

这两个文档描述了一些实现相关的细节,值得一看。

Python源代码文件的文本编码相关推荐

  1. python申明文件编码_Python源代码文件的文本编码

    原博文 2012-07-22 01:46 − 源代码的编码问题对于任何语言的源文件都是存在的,只不过对于脚本语言,这个问题更突出一些. 有的人可能会说,既然源代码在文本编辑器中可以正常显示,说明编码没 ...

  2. Python 文件操作中的读写模式:open(path, ‘-模式-‘,encoding=‘UTF-8‘)+python读写文件txt +文本数据预处理

    python读写txt文件 文件的打开的两种方式f = open("data.txt","r") #设置文件对象 f.close() #关闭文件#为了方便,避免 ...

  3. python源代码文件后缀,python源文件后缀是什么-Python教程

    python源文件后缀是py. 以 py 扩大名的文件是 Python 源码文件,由 python.exe 诠释,可正在管制台下运转.可用文本编纂器读写. Python中常常应用的文件后缀名: pyc ...

  4. Python 3 文件和字符编码

     一.文件: 打开文件的模式有: r,只读模式(默认).w,只写模式. 不可读,不存在则创建:存在则删除内容a,追加模式. 可读,不存在则创建:存在则只追加内容 "+"表示可以同时 ...

  5. python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  6. python读取python源代码文件_python 读写excel文件操作示例【附源码下载】

    本文实例讲述了python 读写excel文件操作.分享给大家供大家参考,具体如下: 对excel文件的操作,python有第三方的工具包支持,xlutils,在这个工具包中包含了xlrd,xlwt等 ...

  7. 学习笔记(3):跟李宁老师学Python视频课程(19):Python GUI库:PyQt5-配置PyUIC(UI文件转换为Python源代码文件)

    立即学习:https://edu.csdn.net/course/play/7637/155795?utm_source=blogtoedu python -m pyQt5.uic.pyuic mai ...

  8. python读取python源代码文件_python 学习源码练习(2)——简单文件读取

    #文件创建 #!/usr/bin/python3 'makeTextFile.py--create text file' import os ls = os.linesep #get filename ...

  9. 编程中python怎么读-python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

最新文章

  1. python datetime 加一个月_Python 如何计算当前时间减少或增加一个月
  2. VSS 请求程序和 SharePoint 2013
  3. 解决 python中 使用tesserocr,File tesserocr.pyx, line 2401, in tesserocr._tesserocr.image_to_text 报错问题...
  4. java虚拟机之三--理解Java虚拟机体系结构
  5. windows 系统服务(转帖)
  6. ajax传值controller怎么写,关于ajax请求Controller传值问题详细记录
  7. 当一盆植物在MIT成了精,不,它只是成了机器人
  8. Linux -Docker
  9. 解决电脑右键新建没有文本文档的问题
  10. 利用Bitvise SSH Client与proxifier实现SSH全局代理
  11. 获取通过谷歌Google广告下载AndroidAPP并登录用户数量
  12. python读取xlsm文件_在保留VBA宏的同时使用熊猫读取和更新XLSM文件中的图纸 - python...
  13. 使用 Amazon Personalize 快速搭建推荐服务
  14. C#学习笔记:子类于父类的构造函数的关系【By Myself】
  15. Android之人脸识别
  16. 知道自己在做什么很重要
  17. gdc服务器sr1000自动化创建,GDC单机自动化操作
  18. logback日志过滤
  19. 基于停车管理系统的分析与理解
  20. layui 页面的嵌套_LayUI--页面元素

热门文章

  1. Linux内存实际使用率
  2. 防止电脑辐射必看 保护好你的肌肤 - 生活至上,美容至尚!
  3. 去掉838的“消息已发送”的提示
  4. sql 整改措施 注入_防止SQL注入的五种方法
  5. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型
  6. Android ListView反复调用getView和getCount
  7. iPhone开发之self.的用法
  8. Linux基础命令--grep/find
  9. Python笔记16-------类
  10. 【SeaJS】【1】初识SeaJS