python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法
如果要在python2的py文件里面寫中文,則必須要添加一行聲明文件編碼的注釋,否則python2會(huì)默認(rèn)使用ASCII編碼。(python3已經(jīng)沒有這個(gè)問題了,python3默認(rèn)的文件編碼是UTF-8)
必須將編碼注釋放在第一行或者第二行,一般來說,Python文件的前兩行要這樣寫:
#!/usr/bin/python # -*- coding: UTF-8 -*-
其中第一行是指定python解釋器,第二行是指定python文件編碼方式,設(shè)置編碼方式有以下可選的方法
1. 帶等號(hào)的設(shè)置方法:
#!/usr/bin/python # coding=<encoding name>
2. 最常見的,帶冒號(hào)的(大多數(shù)編輯器都可以正確識(shí)別的):
#!/usr/bin/python # -*- coding: <encoding name> -*-
3. vim的:
#!/usr/bin/python # vim: set fileencoding=<encoding name> :
設(shè)置頭部的編碼聲明有以下幾個(gè)作用:
如果代碼中有中文注釋,就需要此聲明
比較高級(jí)的編輯器(比如我的emacs),會(huì)根據(jù)頭部聲明,將此作為代碼文件的格式。
程序會(huì)通過頭部聲明,解碼初始化 u”人生苦短”,這樣的unicode對象,(所以頭部聲明和代碼的存儲(chǔ)格式要一致)
設(shè)置默認(rèn)解碼格式
import sys #引用sys模塊進(jìn)來,并不是進(jìn)行sys的第一次加載 reload(sys) #重新加載sys sys.setdefaultencoding('utf8') ##調(diào)用setdefaultencoding函數(shù)
這里特別注意的是第二行的reload(sys),這個(gè)一定不能少,少了的話就不能正確運(yùn)行。那么為什么要重新加載,而直接引用過來則不能調(diào)用該函數(shù)呢?因?yàn)閟etdefaultencoding函數(shù)在被系統(tǒng)調(diào)用后被刪除了,所以通過import引用進(jìn)來時(shí)其實(shí)已經(jīng)沒有了,所以必須reload一次sys模塊,這樣setdefaultencoding才會(huì)為可用,才能在代碼里修改解釋器當(dāng)前的字符編碼。
在python安裝目錄的Lib文件夾下,有一個(gè)叫site.py的文件,在里面可以找到main() –> setencoding()–>sys.setdefaultencoding(encoding),因?yàn)檫@個(gè)site.py每次啟動(dòng)python解釋器時(shí)會(huì)自動(dòng)加載,所以main函數(shù)每次都會(huì)被執(zhí)行,setdefaultencoding函數(shù)一出來就已經(jīng)被刪除了。
關(guān)于 sys.defaultencoding,這個(gè)在解碼沒有明確指明解碼方式的時(shí)候使用。比如我有如下代碼:
#! /usr/bin/env python # -*- coding: utf-8 -*- s = '中文' # 注意這里的 str 是 str 類型的,而不是 unicode s.encode('gb18030')
這句代碼將 s 重新編碼為 gb18030 的格式,即進(jìn)行 unicode -> str 的轉(zhuǎn)換。因?yàn)?s 本身就是 str 類型的,因此
Python 會(huì)自動(dòng)的先將 s 解碼為 unicode ,然后再編碼成 gb18030。因?yàn)榻獯a是python自動(dòng)進(jìn)行的,我們沒有指明解碼方式,python 就會(huì)使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是
ANSCII,如果 s 不是這個(gè)類型就會(huì)出錯(cuò)。拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和文件的編碼方式一致,是 utf8 的,所以出錯(cuò)了:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
對于這種情況,我們有兩種方法來改正錯(cuò)誤:
一是明確的指示出 s 的編碼方式
#! /usr/bin/env python # -*- coding: utf-8 -*- s = '中文' s.decode('utf-8').encode('gb18030')
二是更改 sys.defaultencoding 為文件的編碼方式
#! /usr/bin/env python # -*- coding: utf-8 -*- import sys reload(sys) # Python2.5 初始化后會(huì)刪除 sys.setdefaultencoding 這個(gè)方法,我們需要重新載入 sys.setdefaultencoding('utf-8') str = '中文' str.encode('gb18030')
以上這篇python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Python爬蟲錯(cuò)誤之twisted.web.error.SchemeNotSupported: Unsu
這篇文章主要介紹了解決Python爬蟲錯(cuò)誤之twisted.web.error.SchemeNotSupported: Unsupported scheme: b''問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python continue繼續(xù)循環(huán)用法總結(jié)
本篇文章給大家總結(jié)了關(guān)于Python continue繼續(xù)循環(huán)的相關(guān)知識(shí)點(diǎn)以及用法,有需要的朋友跟著學(xué)習(xí)下吧。2018-06-06python基于tkinter制作下班倒計(jì)時(shí)工具
這篇文章主要介紹了python基于tkinter制作倒計(jì)時(shí)工具的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04Python中shapefile轉(zhuǎn)換geojson的示例
今天小編就為大家分享一篇關(guān)于Python中shapefile轉(zhuǎn)換geojson的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01解決keras,val_categorical_accuracy:,0.0000e+00問題
這篇文章主要介紹了解決keras,val_categorical_accuracy:,0.0000e+00問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07