GVKun编程网logo

定义Python源代码编码的正确方法(python源代码编译)

13

对于想了解定义Python源代码编码的正确方法的读者,本文将是一篇不可错过的文章,我们将详细介绍python源代码编译,并且为您提供关于PEP263--DefiningPythonSourceCode

对于想了解定义Python源代码编码的正确方法的读者,本文将是一篇不可错过的文章,我们将详细介绍python源代码编译,并且为您提供关于PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)、Python 2假定不同的源代码编码、Python 获取脚本所在目录的正确方法、Python-将行写入文件的正确方法?的有价值信息。

本文目录一览:

定义Python源代码编码的正确方法(python源代码编译)

定义Python源代码编码的正确方法(python源代码编译)

PEP 263定义了如何声明Python源代码编码。

通常,Python文件的前两行应以:

#!/usr/bin/python# -*- coding: <encoding name> -*-

但是我看过很多以以下内容开头的文件:

#!/usr/bin/python# -*- encoding: <encoding name> -*-

=> 编码而不是编码。

那么,声明文件编码的正确方法是什么?

是了编码允许的,因为所使用的正则表达式是懒惰?还是仅仅是声明文件编码的另一种形式?

我问这个问题是因为PEP不在谈论编码,它只是在谈论编码。

答案1

小编典典

在这里检查文档:

“如果Python脚本的第一行或第二行中的coding[=:]\s*([-\w.]+)注释与正则表达式匹配,则此注释将作为编码声明处理”

“此表述的推荐形式是

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

GNU Emacs也承认这一点,并且

# vim:fileencoding=<encoding-name>

被Bram Moolenaar的VIM认可。”

因此,你可以在“编码”部分之前放置几乎所有内容,但如果要100%兼容python-docs-recommendation,则应坚持使用“编码”(无前缀)。

更具体地说,你需要使用Python可以识别的任何东西以及你使用的特定编辑软件(如果它完全需要/接受任何东西)。例如,coding表格被GNU Emacs识别(开箱即用),但未被Vim识别(是的,没有普遍的协议,这本质上是一场草皮大战)。

PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)

PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)

官方文档:https://www.python.org/dev/peps/pep-0263/

概要

这个PEP建议引入一个语法来声明Python源文件的编码。 Python解析器将使用这个编码信息中给定的编码来解释文件。 最引人注意的是,这增强了源代码中Unicode字符的解释。

 

问题描述

在Python 2.1中,Unicode字符只能使用基于Latin-1的“unicode-escape”编码编写。 这对生活和工作在非Latin-1语言环境(如许多亚洲国家)的Python用户来说是不友好的。 程序员可以使用最喜欢的编码来编写他们的8位字符串,但是他们被绑定到非得使用“unicode-escape”来编码Unicode字符。

 

解决方案

我建议在python源代码文件顶部的使用特殊注释来声明编码,使Python源代码的编码在每个源文件的基础上可见和可变。

为了使Python解释器意识到这个编码声明,在处理Python源代码数据方面需要进行一些概念更改。

 

定义编码

如果没有给出其他编码提示,Python将默认将ASCII作为标准编码。

要定义源代码编码,必须将编码声明放在源文件中,或者作为文件中的第一行或第二行,例如:

#coding=<encoding name>

 

或(使用各种流行的编辑器都认可的格式):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

 

或者

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
 

更准确地说,第一行或第二行必须与以下正则表达式相匹配:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

 

此表达式的第一组然后解释为编码名称。 如果编码对于Python是未知的,编译过程中会出现错误。 在包含编码声明的行上不能有任何Python语句。 如果第一行匹配第二行被忽略。

为了帮助那些将Unicode BOM标记添加到Unicode文件的开头的操作系统,比如Windows的平台,,UTF-8签名\ xef \ xbb \ xbf也将被解释为’utf-8’编码(即使没有编码声明中 给出)。

如果源文件使用UTF-8 BOM标记签名和编码声明,则该文件的唯一允许的编码为“utf-8”。 任何其他编码都会导致错误。

 

示例

1.设置其他非utf-8字符

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
print(''阿甘'')
 

结果:

 

 

 2.设置utf-8字符

#!/usr/local/bin/python
# coding:utf-8
print(''阿甘'')

结果:

 

3.设置没有的字符

#!/usr/local/bin/python
# coding:utf-88
print(''阿甘'')

 

结果:

 

概念

PEP基于以下概念,必须实现这些概念才能使用这种注释:

1.完整的Python源代码文件应该使用单一编码。不允许嵌入不同编码的数据,在编译Python源代码时将导致解码错误。

任何允许以上述方式处理前两行的编码都可以作为源代码编码,这包括ASCII兼容编码以及某些多字节编码,比如Shift_JIS,unicode。它不包括对所有字符(如UTF-16)使用两个或多个字节的编码。这样做的原因是为了使标记器中的编码检测算法保持简单 。

2.转义序列的处理应该像现在一样继续工作,但是对于所有可能的源代码编码,即标准字符串字面量(8位和Unicode)都可以进行转义序列扩展,而原始字符串字面量只扩展了转义序列的一个非常小的子集。

 

3.python的编译器将进行如下的转换工作:

A.读取文件

B.将其解码为Unicode,假设每个文件有固定的编码

C.将其转换为UTF-8字节字符串

D.处理UTF-8的内容

E.编译它,从给定的Unicode数据中创建Unicode对象,并通过使用给定的文件编码将UTF-8数据重新编码为8 位字符串数据,从Unicode文字数据创建字符串对象

 请注意,Python标识符仅限于编码的ASCII子集,因此不需要在步骤之后进行进一步的转换

 

reference:https://blog.csdn.net/u013793383/article/details/73369315

 看看完后,又可以补编码的知识了!

 个人学习笔记,翻译有限,理解翻译之错,请指教!

Python 2假定不同的源代码编码

Python 2假定不同的源代码编码

我注意到,在没有源代码编码声明的情况下,Python 2解释器假定源代码使用 脚本标准输入 以ASCII编码:

$ python test.py  # where test.py holds the line: print u'é'
  File "test.py",line 1
SyntaxError: Non-ASCII character '\xc3' in file test.py on line 1,but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

$ echo "print u'é'" | python
  File "/dev/fd/63",line 1
SyntaxError: Non-ASCII character '\xc3' in file /dev/fd/63 on line 1,but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

并使用-m 模块-c 命令 标志在ISO-8859-1中进行了编码:

$ python -m test  # where test.py holds the line: print u'é'
é

$ python -c "print u'é'"
é

它在哪里记录?

与此相反,Python 3始终假定源代码是用UTF-8编码的,因此可以é在四种情况下打印。

注意。 –我在控制台编码设置为UTF-8的macOS 10.13和Ubuntu Linux 17.10上的CPython 2.7.14上进行了测试。

Python 获取脚本所在目录的正确方法

Python 获取脚本所在目录的正确方法

1

C:test
  [dir] getpath
    [file] path.py
    [dir]  sub
      [file] sub_path.py

比如

C:\test 目录下还有一个名为 sub 的目录;

C:\test 目录下有 getpath.py,sub 目录下有 sub_path.py,getpath.py 调用 sub_path.py;

我们在 C:\test 下执行 getpath.py。如果我们在 sub_path.py 里面使用 sys.path [0],那么其实得到的是 getpath.py 所在的目录路径 “C:\test”,因为 Python 虚拟 机是从 getpath.py 开始执行的。如果想得到 sub_path.py 的路径,那么得这样:
os.path.split(os.path.realpath(__file__))[0]

验证:

然后我们在 C:\test 下面执行 python getpath/path.py,这时 sub_path.py 里面与各种用法对应的值其实是:
os.getcwd () “C:\test”,取的是起始执行目录
sys.path [0] 或 sys.argv [0] “C:\test\getpath”,取的是被初始执行的脚本的所在目录
os.path.split (os.path.realpath (__file__))[0] “C:\test\getpath\sub”,取的是__file__所在文件 sub_path.py 的所在目录


Python-将行写入文件的正确方法?

Python-将行写入文件的正确方法?

我已经习惯了 print >>f, "hi there"

但是,似乎print >>已经弃用了。推荐使用哪种方法进行上述操作?

更新:关于…的所有这些答案,”\n”这是通用的还是特定于Unix的?IE,我应该"\r\n"在Windows上运行吗?

答案1

小编典典

这应该很简单:

with open(''somefile.txt'', ''a'') as the_file:    the_file.write(''Hello\n'')

从文档:

os.linesep写入以文本模式打开的文件时(默认),请勿用作行终止符;在所有平台上都使用一个’\ n’代替。

一些有用的读物​​:

  • with声明
  • open()
  • ‘a’用于追加或使用
  • ‘w’截断书写
  • os(特别是os.linesep)

答案2

小编典典

你应该使用print() Python 2.6+起提供的功能

from __future__ import print_function  # Only needed for Python 2print("hi there", file=f)

对于Python 3,你不需要import,因为该 print()功能是默认设置。

替代方法是使用:

f = open(''myfile'', ''w'')f.write(''hi there\n'')  # python will convert \n to os.linesepf.close()  # you can omit in most cases as the destructor will call it

引用Python文档中有关换行符的内容:

在输出中,如果换行符为None,则所有''\n''写入的字符都会转换为系统默认的行分隔符os.linesep。如果newline'''',则不会进行翻译。如果换行符是其他任何合法值,''\n''则将写入的所有字符转换为给定的字符

今天关于定义Python源代码编码的正确方法python源代码编译的介绍到此结束,谢谢您的阅读,有关PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)、Python 2假定不同的源代码编码、Python 获取脚本所在目录的正确方法、Python-将行写入文件的正确方法?等更多相关知识的信息可以在本站进行查询。

本文标签: