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

-*- coding: utf-8 -*-:让中文代码不再乱码的 “翻译官” 让程序能正确读取包含中文、日文等非英文字符的代码文件。如同U盘插入不同电脑时需要选择正确的文件系统格式(NTFS/FAT32),这个声明告诉Python用。当N=1000时,GBK需1100字节,UTF-8需1200字节,GBK节省空间但牺牲兼容性。:若代码文件包含90%英文和10%中文,GBK总字节数为。相当于给Python解释器配备。:汉字“码”的Unicode码点是。双字节字符(如部分中文)三字节字符(常用汉字)#Python编码声明。 阅读详情

#!/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派看看吧!!

 

 

避坑指南:HslCommunication连接西门子PLC时常见的5个错误及解决方法(S7-1200/S1500适用) 本文详细解析了使用HslCommunication连接西门子S7-1200/S1500 PLC时常见的5个错误及解决方法,包括基础连接配置、数据块读写异常、连接闪断、防火墙与权限问题以及高级调试技巧。通过实战案例和代码示例,帮助开发者快速定位和解决连接问题,提升工业自动化项目的开发效率。 阅读详情

相关推荐

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

清影的博客 6281

【Python】新手入门(5):# -*- coding: UTF-8 -*- 的作用详解

📚【Python新手入门】一文详解`# -*- coding: UTF-8 -*-`的作用!💡 编码声明在Python中至关重要,确保字符正确显示。📜 文章教你如何正确使用`# -*- coding: UTF-8 -*-`,避免乱码问题。🔍 还有方法教你如何确定文件编码。📖 总结与回顾让你更好地掌握编码知识。🤝 与你共同进步,探索Python的无限魅力!#Python编码声明 #UTF8编码 #Python新手入门 #乱码问题解决方案

创作高质量博文,分享知识,共同进步! 6763

IC芯片验证 - 手把手教你搭建UVM验证环境

这是一个UVM的demo项目

howard789的博客 3万+

Python代码中“# -*- coding: utf-8 -*-”的作用及正确的位置

Python代码中“# -*- coding: utf-8 -*-”的作用及正确的位置

昊虹AI笔记 1万+

CocosCreator3.8实战指南:动态字体与位图字体性能优化技巧

本文深入解析CocosCreator3.8中系统字体、动态字体(TTF)与位图字体(FNT)的核心差异与性能表现。针对动态字体运行时解析开销大、内存占用高的痛点,提供了字体子集化、共享资源等优化技巧;同时详细介绍了位图字体制作流程及其在渲染速度、内存可控性上的绝对优势,并给出跨平台场景下的字体选型与优化策略,帮助开发者有效提升游戏性能。

weixin_29006701的博客 563

ADS使用Smith圆图进行阻抗匹配

在处理RF系统的实际应用问题时,总会遇到一些非常困难的工作,对各部分级联电路的不同阻抗进行匹配就是其中之一。一般情况下,需要进行匹配的电路包括天线与低噪声放大器(LNA)之间的匹配、功率放大器输出(RFOUT)与天线之间的匹配、LNA/VCO输出与混频器输入之间的匹配。匹配的目的是为了保证信号或能量有效地从“信号源”传送到“负载”。 阻抗匹配(impedance matching) 信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输

红茶绿茶和奶茶的博客 3万+

# -*- coding: UTF-8 -*-

现象:最近需要抓取一些网页的信息,但发现Python的乱码问题相对Java来说,不太一样。按照以往Java解决中文乱码问题的思路去解决Python乱码,貌似行不通,报错信息: SyntaxError: Non-ASCII character '\xe5' in file 原因:Python默认是以ASCII作为编码方式的,如果在自己的Python源码中包含了中文(或者其他的语言,比如小日本的日...

Stillboring的博客 3万+

无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架

无人水面艇USV是海上自主无人系统的关键组成部分,在民用、军用领域应用广泛,例如海上救援、水质测量、扫雷反潜等,因此对USV导航算法的研究具有重要意义。为了便于进行USV相关算法的验证与部署,本文介绍的这套基于ROS的多无人艇的自主导航仿真平台,轻量化地实现了建图、规划、控制等多种功能,同时自研框架保证了功能的高度可拓展和可定制

FRIGIDWINTER的博客 7995

为什么有的代码上面写一个# -*- coding:utf-8 -*-呢?

Python 2.x版本默认使用ASCII编码,不支持直接写入中文字符,这导致在代码中直接使用中文时会出现编码错误。为了解决这一问题,并规范编码的使用,Python提供了一种特殊的注释方式来声明源代码文件的编码。

2401_87245171的博客 2156

使用R语言读取和处理CSV数据集

查看数据集的结构str(data)# 查看数据集的摘要统计信息str()函数将显示数据集的结构信息,包括变量名称、类型和前几行的值。summary()函数将提供数据集的摘要统计信息,如均值、中位数、最小值、最大值等。

CyberGenius的博客 3855

YOLOv13改进:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

BiLevelRoutingAttention方法对小目标检测效果比较好。可能是因为BRA模块是基于稀疏采样而不是下采样,一来可以保留细粒度的细节信息,二来同样可以达到节省计算量的目的。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1432

【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型...

原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。   # -*- coding: utf-...

weixin_34387284的博客 1929

YOLO蒸馏原理篇之---MGD、CWD蒸馏

本文详细介绍了特征蒸馏中的两种经典有效方法,MGD和CWD蒸馏

qq_41920323的博客 3240

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

Python脚本开头都有下面的两行,*而且一定在前两行* #!/usr/bin/env python # -*- coding:utf-8 -*- 或者 #!/usr/bin/python # -*- coding:utf-8 -*- 1.#!/usr/bin/env python 或 #!/usr/bin/python 它是用来指定用什么解释器运行脚本以及解释器所在的位置。也就是说你...

灵感点滴的分享 1207

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

#!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。 # -- coding: utf-8 -- 是用来指定文件编码为utf-8的 详情可以参考: PEP 0263 — Defining Python Source Code Encodings 在此,详细的(主要...

Lapland的博客 304

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

#!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。 # -*- coding: utf-8 -*- 是用来指定文件编码为utf-8的 详情可以参考: PEP 0263 — Defining Python Source Code Encoding...

chuanyuanshuo的博客 962

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

关于Python脚本开头及导包注释自动添加

1、开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定#!/usr/bin/python是用来说明脚本语言是python的是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。#!/usr/bin/python:是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 pyth...

qq_40024178的博客 5637

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

#!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*- 用来指定文件编码为utf-8的 PEP 0263 -- Defining Python Source Code Encodings http://www.python.org/dev/peps/pep-0263/ 估计有不少人注意过一些python脚本开

sevie_seraph的博客 663

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

#!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置# -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining Python Source Code Encodingshttp://www.python.org/dev/peps/pep-0263/ 估计有不少人注意过一些python脚本开头有这么行东东...

dkyptnz538386的博客 178

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

关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 转 #!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。   # -*- coding: utf-8 -*- 是用来指定文件编...

wengduke的博客 1411

python第一行注释_浅谈Python脚本开头及导包注释自动添加方法

1、开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定#!/usr/bin/python是用来说明脚本语言是python的是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。#!/usr/bin/python:是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 pyth...

weixin_39708822的博客 448

python的注释以什么开头_浅谈Python脚本开头及导包注释自动添加方法

1、开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定#!/usr/bin/python是用来说明脚本语言是python的是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。#!/usr/bin/python:是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 pyth...

weixin_39847732的博客 761

(好文转发)关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

转载自http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。   # -*- codi

山海皆可平z 846

python添加注释的方法以及意义_浅谈Python脚本开头及导包注释自动添加方法

1、开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定#!/usr/bin/python是用来说明脚本语言是python的是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。#!/usr/bin/python:是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 pyth...

weixin_36184985的博客 545
上一篇: Python中用encoding声明的文件编码和文件的实际编码之间的关系
下一篇: 字符编码简明教程
Wang_AI
博客等级 码龄12年 988粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值