对于想了解定义Python源代码编码的正确方法的读者,本文将是一篇不可错过的文章,我们将详细介绍python源代码编译,并且为您提供关于PEP263--DefiningPythonSourceCode
对于想了解定义Python源代码编码的正确方法的读者,本文将是一篇不可错过的文章,我们将详细介绍python源代码编译,并且为您提供关于PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)、Python 2假定不同的源代码编码、Python 获取脚本所在目录的正确方法、Python-将行写入文件的正确方法?的有价值信息。
本文目录一览:- 定义Python源代码编码的正确方法(python源代码编译)
- PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)
- Python 2假定不同的源代码编码
- 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可以识别的任何东西以及你使用的特定编辑软件(如果它完全需要/接受任何东西)。例如,codin
g表格被GNU Emacs识别(开箱即用),但未被Vim识别(是的,没有普遍的协议,这本质上是一场草皮大战)。
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解释器假定源代码使用 脚本 和 标准输入 以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 获取脚本所在目录的正确方法
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-将行写入文件的正确方法?
我已经习惯了 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-将行写入文件的正确方法?等更多相关知识的信息可以在本站进行查询。
本文标签: