关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定

2023-11-12

#!/usr/bin/python

是用来说明脚本语言是python的

是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。

 

# -*- coding: utf-8 -*-

是用来指定文件编码为utf-8的

详情可以参考:

PEP 0263 — Defining Python Source Code Encodings

 

在此,详细的(主要是翻译)解释一下,为何要加这个编码声明,以及如何添加编码声明:

 

使用文件编码声明以前所遇到的问题

Python 2.1中,想要输入Unicode字符,只能用基于Latin-1的"unicode-escape"的方式输入 -> 对于其他非Latin-1的国家和用户,想要输入Unicode字符,就显得很繁琐,不方便。

希望是:

编程人员,根据自己的喜好和需要,以任意编码方式输入字符串,都可以,这样才正常。

 

建议选用的方案

所以,才有人给Python官方建议,所以才有此PEP 0263。

此建议就是:

允许在Python文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的python文件,用何种编码。

由此,需要很多地方做相应的改动,尤其是Python文件的解析器,可以识别此种文件编码声明。

 

具体如何声明python文件编码?

上面已经说了,是,文件开始处的,放在注释中的,字符串形式的,声明。

那具体如何声明,以什么样的格式去声明呢?

其实就是,你之前就见过的,这种:

?

1

# -*- coding: utf-8 -*-

对此格式的详细解释是:

  1. 如果没有此文件编码类型的声明,则python默认以ASCII编码去处理
    • 如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。
  2. 必须放在python文件的第一行或第二行
  3. 支持的格式,可以有三种:
    1. 带等于号的:

      ?

      1

      # coding=<encoding name>

    2. 最常见的,带冒号的(大多数编辑器都可以正确识别的):

      ?

      1

      2

      #!/usr/bin/python

      # -*- coding: <encoding name> -*-

    3. vim的:

      ?

      1

      2

      #!/usr/bin/python

      # vim: set fileencoding=<encoding name> :

  4. 更加精确的解释是:
    • 符合正则表达式:

      ?

      1

      "coding[:=]\s*([-\w.]+)"

    • 的都可以,很明显,如果你熟悉正则表达式,也就可以写出来,其他一些合法的编码声明,以utf-8为例,比如:

      ?

      1

      2

      3

      4

      5

      coding:         utf-8

      coding=utf-8

      coding=                  utf-8

      encoding:utf-8

      crifanEncoding=utf-8

  5. 为了照顾特殊的Windows中的带BOM(’\xef\xbb\xbf’)的UTF-8
    1. 如果你的python文件本身编码是带BOM的UTF-8,即文件前三个字节是:’\xef\xbb\xbf’,那么:
      1. 即使你没有声明文件编码,也自动当做是UTF-8的编码
      2. 如果你声明了文件编码,则必须是声明了(和你文件编码本身相一致的)UTF-8
        1. 否则(由于声明的编码和实际编码不一致,自然)会报错

 

文件编码声明的各种例子

针对上面的规则,下面给出各种,合法的,非法的,例子,供参考:

合法的python文件编码声明

  1. 带声明了解释器的,Emacs风格的,(注释中的)文件编码声明
    1. 例子1:

      ?

      1

      2

      3

      4

      #!/usr/bin/python

      # -*- coding: latin-1 -*-

      import os, sys

      ...

    2. 例子2:

      ?

      1

      2

      3

      4

      #!/usr/bin/python

      # -*- coding: iso-8859-15 -*-

      import os, sys

      ...

    3. 例子3:

      ?

      1

      2

      3

      4

      #!/usr/bin/python

      # -*- coding: ascii -*-

      import os, sys

      ...

  2. 不带声明了解释器的,直接用纯文本形式的:

    ?

    1

    2

    3

    # This Python file uses the following encoding: utf-8

    import os, sys

    ...

  3. 文本编辑器也可以有多种(其他的)定义编码的方式:

    ?

    1

    2

    3

    4

    #!/usr/local/bin/python

    # coding: latin-1

    import os, sys

    ...

    • 很明显,其中的没用-*-,直接用了coding加上编码值
  4. 不带编码声明的,默认当做ASCII处理:

    ?

    1

    2

    3

    #!/usr/local/bin/python

    import os, sys

    ...

非法的python文件编码声明举例

  1. 少了coding:前缀

    ?

    1

    2

    3

    4

    #!/usr/local/bin/python

    # latin-1

    import os, sys

    ...

  2. 编码声明不在第一行或第二行:

    ?

    1

    2

    3

    4

    5

    #!/usr/local/bin/python

    #

    # -*- coding: latin-1 -*-

    import os, sys

    ...

  3. 不支持的,非法的字符编码(字符串)声明:

    ?

    1

    2

    3

    4

    #!/usr/local/bin/python

    # -*- coding: utf-42 -*-

    import os, sys

    ...

 

python文件编码声明所遵循的理念

1.单个的完整的python源码文件中,只用单一的编码。

->

不允许嵌入了多种的编码的数据

否则会导致(python解释器去解析你的python文件时)报编码错误。

 

不太懂这段:

Any encoding which allows processing the first two lines in the way indicated above is allowed as source code encoding, this includes ASCII compatible encodings as well as certain multi-byte encodings such as Shift_JIS. It does not include encodings which use two or more bytes for all characters like e.g. UTF-16. The reason for this is to keep the encoding detection algorithm in the tokenizer simple.

 

2.这段也不太懂:

Handling of escape sequences should continue to work as it does now, but with all possible source code encodings, that is standard string literals (both 8-bit and Unicode) are subject to escape sequence expansion while raw string literals only expand a very small subset of escape sequences.

 

3.Python的分词器+编译器,会按照如下的逻辑去工作:

  1. 读取文件
  2. 不同的文件,根据其声明的编码去解析为Unicode
  3. 转换为UTF-8字符串
  4. 针对UTF-8字符串,去分词
  5. 编译之,创建Unicode对象

要注意的是:

Python中的标识符,都是ASCII的。

 

其余的内容,不翻译了。

至此,已经解释的够清楚了。

 

原文链接:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/

想学人工智能(Python、数据分析、机器学习、深度学习、推荐系统、强化学习),来公众号AI派看看吧!!

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定 的相关文章

  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 根据 Pandas 中的列表选择数据框行的子集

    我有一个数据框df1并列出x In 22 import pandas as pd In 23 df1 pd DataFrame C range 5 B range 10 20 2 A list abcde In 24 df1 Out 24
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • 数学建模(生物数学篇)之 MATLAB在求解高阶微分方程时的应用实例(3/3)

    一 实验目的 理解并掌握利用MATLAB在求解高阶微分方程时的应用 二 实验内容 求解高阶微分方程时 可想办法将其变为几个一阶微分方程组成的微分方程组 例1 选择变量 可得出一阶微分方程组为 例2 设系统模型以二元方程组形式给出 试将其转化
  • IDEA实现 springmvc的简单注册登录

    IDEA实现 springmvc的简单登录 1 基本环境搭建 spring简介 SpringMVC框架是以请求为驱动 围绕Servlet设计 将请求发给控制器 然后通过模型对象 分派器来展示请求结果视图 其中核心类是DispatcherSe
  • 我同情那些不写单元测试的傻瓜

    J Timothy King写了一篇很棒的文章 先写单元测试的12个好处 Twelve Benefits of Writing Unit Tests First 遗憾的是 他在文章最后说的话完全是画蛇添足 然而 如果你不愿意改掉先写代码的老
  • java实现【国密SM4】加密解密-CBC模式

    网上有很多个版本 但是算法都是一样的 有可能使用相同的参数来加密解密文本得到的加密字符是不一样的 在此统一说下 SM4实现的功能 商业加密 SM4功能是加密文本 例如客户A把字符串 hello world 通过SM4的cbc模式加密后得到密
  • Kali Hyper-V安装正常启动后 黑屏 只能进命令模式

    问题 Hyper V安装虚拟机Kali系统一切安装正常 没有出现错误 安装成功后重启 只能进入命令模式 tt1 tt6 进不去GUI桌面 尝试 一代二代虚拟硬盘都试过 同样问题 只能开进后进入命令模式 在命令模式下一切运行正常 也修复过系统
  • 深入理解 Python 中的元类

    1 类是如何产生的 类是如何产生 这个问题肯定很傻 实则不然 很多初学者只知道使用继承的表面形式来创建一个类 却不知道其内部真正的创建是由type来创建的 type 这不是判断对象类型的函数吗 是的 type通常用法就是用来判断对象的类型
  • 快速查看自己的全部文章,帮助下找不到私人发布的小伙伴

    刚刚加入csdn 不知道自己发布过的文章在哪 可以点击链接直接查看 CSDN
  • 深度学习神经网络优化器总结

    深度学习神经网络优化器有以下几种 1 梯度下降法 Gradient Descent 2 随机梯度下降法 Stochastic Gradient Descent 3 批量梯度下降法 Batch Gradient Descent 4 动量法 M
  • win10录完指纹要求验证pin,输完pin闪退

    win10用了几个月指纹会失效 重新设置指纹会因为无法设置pin码而失败 目前解决方案将Credential Manager服务改为自动并启用 每个人指纹失效的原因不一样 我把网上能搜到的都试了一遍不行 这是自己摸索的 不一定能解决每个人的
  • Linux 使用 cp 命令强制覆盖功能

    我们平时在 Linux 中使用 cp 命令时 当把文件从一个目录复制到另一个目录 且目录中具有同名文件时 系统会提示输入 y 来确认是否覆盖同名文件 如果文件少的话 也无关紧要 但文件多的话 要一个一个确认简直太累了 更要命的是 即使我们加
  • 蓝牙模块怎么使用_有线音箱完美升级蓝牙功能,只需2杯咖啡钱!

    文章作者 噩梦飘雷结束一天繁忙的工作 相信很多人都跟小值一样 喜欢打开手机 播放起自己喜欢的歌单 音乐响起 就能双脚离地 暂时漂浮于眼前的苟且之上 让自己喘口气 当然比起戴上耳机安静地狂欢 外放音乐 让音符充满房间 是种更身临其境的享受 在
  • 【PAT甲级】1074 Reversing Linked List (25 point(s))

    Given a constant K K K and a singly linked list L L L you are supposed to reverse the links of every
  • 【ESP32-CAM】使用opencv获取ESP32-CAM视频流,并将图像保存至TF卡(一)

    VSCode python opencv ESP32 CAM 本项目仅作为学习记录 不定时更新 Arduino 对于ESP32 CAM 我们使用Arduino来开发 首先需要准备一些硬件 ESP32 CAM 在淘宝大约30rmb一个 烧录底
  • 回归预测算法比较

    GBDT和时间序列分析的区别 GBDT算法做预测分析时考虑到一些影响目标值的因素 而时间序列主要考虑到数据在时序上的一些规律 忽略了其他因素对目标值的影响 这两种算法在实际应用中刚好互补 如果原始数据中包含足够的数据特征 通常情况下使用GB
  • FaceForensics和FaceForensics++【参考文献30和31】

    30 FaceForensics学术界最大的合成视频数据库之一 介绍了一个新的面部操作数据集 大约有50万张经过编辑的图像 来自1000多个视频 这些操作是用最先进的面部编辑方法生成的 它超过了所有现有的视频操作数据集至少一个数量级 利用我
  • 今天,大语言模型革新百度搜索

    机器之心原创 作者 泽南 别搜关键词了 百度搜索直接给你正确答案 最近几天 一些最常用的工具正在被大厂重新发明 ChatGPT 横空出世后 整个科技领域突然就开上了快车道 今年 2 月 微软推出的 AI 版必应 用最先进的大语言模型重构了搜
  • C语言之指针的概念必备练习题

    对于指针 想必是多少人刚开始学习时候的梦魇 笔者也一样 一套关于指针概念的练习题请大家多多仔细阅读 体会不一样的感觉 1 作业标题 711 关于指针的概念 错误的是 作业内容 A 指针是变量 用来存放地址 B 指针变量中存的有效地址可以唯一
  • 用MOS管驱动电机吧

    图示为我应用于实际的空心杯电机驱动电路 可见 该电路通过MCU的PWM信号控制电机 实现了无刷电机的无极调速 该电路的基本思想就是通过PWM信号控制MOS管 SI2302 的开与关 改变PWM的占空比 进而改变流过电机的有效电流 从而控制电
  • python thread_Python thread模块用法详解

    该包在 Python 2 中属于正常可用状态 但在 Python 3 中处于即将废弃的状态 虽然还可以用 但包名被改为 thread 使用 thread 包首先要引入该包 在 Python 2 中使用下面的语句来引入 import thre
  • 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定

    usr bin python 是用来说明脚本语言是python的 是要用 usr bin下面的程序 工具 python 这个解释器 来解释python脚本 来运行python脚本的 coding utf 8 是用来指定文件编码为utf 8的