Python 直譯器執行檔案的三個階段

2021-10-08 03:25:28 字數 1908 閱讀 3357

字元編碼見此

1、 python直譯器執行檔案的前兩個階段

執行py檔案的前兩個階段就是python直譯器讀文字檔案的過程,與文字編輯讀文字檔案的前兩個階段沒有任何區別,要保證讀不亂碼,則必須將python直譯器讀檔案時採用的編碼方式設定為檔案當初寫入硬碟時的編碼格式,如果沒有設定,python直譯器則才用預設的編碼方式,在python3中預設為utf-8,在python2中預設為ascii。

我們可以通過指定檔案頭來修改預設的編碼:

# 在檔案首行寫入包含#號在內的以下內容

# coding: 當初檔案寫入硬碟時採用的編碼格式

直譯器會先用預設的編碼方式讀取檔案的首行內容,由於首行是純英文組成,而任何編碼方式都可以識別英文本元。

2、python直譯器執行檔案的第三個階段

設定檔案頭的作用是保證執行python程式的前兩個階段不亂碼,經過前兩個階段後py檔案的內容都會以unicode格式存放於記憶體中。在經歷第三個階段時開始識別python語法,當遇到特定的語法name = 『上』(**本身也都全都是unicode格式存的)時,需要申請記憶體空間來儲存字串』上』,這就又涉及到應該以什麼編碼儲存『上』的問題了。在python3中,字串類的值都是使用unicode格式來儲存由於python2的盛行是早於unicode的,因此在python2中是按照檔案頭指定的編碼來儲存字串型別的值的(如果檔案頭中沒有指定編碼,那麼直譯器會按照它自己預設的編碼方式來儲存『上』),所以,這就有可能導致亂碼問題

# coding:utf-8

x ='上'

# x的值為untf-8格式的二進位制

print

(x)# 列印操作是將x的值,即utf-8格式的二進位制交給終端,當終端收到後發現並不是unicode(只有unicode才與字元有對應關係),所以終端會執行操作:utf-8二進位制---解碼-->unicode格式的二進位制,解碼的過程終端會採用自己預設的編碼,而在pycharm的終端預設編碼為utf-8、windows下的cmd終端的預設編碼為gbk,所以該列印操作在pycharm中顯示正常,而在windows下的cmd中則亂碼

# 在windows下的cmd中執行效果如下

c:\users\administrator>python2 e:\aaa.py

python2後推出了一種補救措施,就是在字串型別前加u,則會將字串型別強制儲存unicode,這就與python3保持一致了,對於unicode格式無論丟給任何終端進行列印,都可以直接對應字元不會出現亂碼問題

# coding:utf-8

x = u'上'

# 即便檔案頭為utf-8,x的值依然存成unicode

3、字串encode編碼與decode解碼的使用

# 1、unicode格式------編碼encode-------->其它編碼格式

>>

> x=

'上'# 在python3在'上'被存成unicode

>>

> res=x.encode(

'utf-8'

)>>

> res,

type

(res)

# unicode編碼成了utf-8格式,而編碼的結果為bytes型別,可以當作直接當作二進位制去使用

(b'\xe4\xb8\x8a'

,<

class

'bytes'

>

)# 2、其它編碼格式------解碼decode-------->unicode格式

>>

> res.decode(

'utf-8'

)'上'

python指令碼執行可執行檔案

python import os device r usbstor disk ven generic prod sd mmc rev 1.00 20100818841300000 0 blocksieze 32kb time 00 00 05 00 mode sr sw sv xr xw xv pa...

Python 打包可執行檔案

python程式需要依賴本機安裝的python庫,若想在沒有安裝python的機器上執行,則需要打包分發,目前有兩個比較好用的工具 pyinstaller和py2exe。其中py2exe應用在windows下,而pyinstall則可應用windows linux以及mac os x上。1 2 3 ...

python獲取執行檔案位置

在網上常見的獲取檔案位置函式如下所示 import sys import os print sys.ar 0 print os.path.abspath print os.getcwd 但是注意後兩個所得到的並不是執行檔案的位置,而是工作目錄的位置 雖然在pycharm中執行結果是正確的 但是我在c...