python3.x讀寫文件及BOM處理詳解
1 python3.x讀寫文件及BOM處理
1.1 python3.x讀取和寫入U(xiǎn)nicode
python3.x的字符串為unicode,可以調(diào)用encode()方法手動(dòng)將字符串編碼為字節(jié)串(原始字節(jié)),也可以通過(guò)文件輸入輸出自動(dòng)編碼。
1.1.1 手動(dòng)編碼
描述
python3.x的字符串通過(guò)encode(編碼名)方法,將字符串轉(zhuǎn)換為原始字節(jié)串。
示例
>>> s='梯'
# python3.x 字符串 str 對(duì)應(yīng) unicode
>>> s,type(s)
('梯', <class 'str'>)
>>> s_gbk=s.encode('gbk')
>>> s_utf8=s.encode('utf-8')
# 1個(gè)漢字,gbk編碼為2個(gè)字節(jié), utf-8 編碼為3個(gè)字節(jié)
# 2位16進(jìn)制 占1個(gè)字節(jié)
>>> s_gbk,s_utf8
(b'\xcc\xdd', b'\xe6\xa2\xaf')
>>> len(s_gbk),len(s_utf8)
(2, 3)
1.1.2 寫文件編碼
描述
open寫文件時(shí),指定的encoding為文件保存到磁盤時(shí)的編碼格式。
示例
# 寫文件時(shí) encoding 表示文件存儲(chǔ)到磁盤的編碼格式
>>> open('gbk.txt','w',encoding='gbk').write('梯')
1
>>> open('utf8.txt','w',encoding='utf-8').write('梯')
1
# 'rb' 二進(jìn)制模式,讀取文件內(nèi)容為bytes類型,為文件實(shí)際存儲(chǔ)的字節(jié)串
# gbk編碼,1個(gè)中文占2個(gè)字節(jié)
>>> open('gbk.txt','rb').read()
b'\xcc\xdd'
# utf-8編碼,1個(gè)中文占3個(gè)字節(jié)
>>> open('utf8.txt','rb').read()
b'\xe6\xa2\xaf'
1.1.3 讀文件編碼
描述
open讀文件時(shí),指定的encoding為解釋器讀取文件字節(jié)串解碼使用的編碼格式。
示例
# 讀文件時(shí) encoding 表示解釋器讀取文件字節(jié)串解碼使用的編碼格式
# 需與文件存儲(chǔ)時(shí)編碼格式相同
>>> open('gbk.txt','r',encoding='gbk').read()
'梯'
>>> open('utf8.txt','r',encoding='utf-8').read()
'梯'
>>> dgbk=open('gbk.txt','rb').read();dgbk
b'\xcc\xdd'
>>> dutf8=open('utf8.txt','rb').read();dutf8
b'\xe6\xa2\xaf'
# 二進(jìn)制模式,讀取文件內(nèi)容后進(jìn)行手動(dòng)解碼
# python3.x 解釋器默認(rèn)編碼為utf-8
>>> dgbk.decode('gbk');dutf8.decode()
'梯'
'梯'
1.2 python讀寫文件默認(rèn)編碼
1.2.1 locale.getpreferredencoding()
用法
import locale locale.getpreferredencoding()
描述
python的locale**.getpreferredencoding()**用于獲取用戶的首選編碼。
入?yún)镕alse,表示不使用任何額外設(shè)置。
入?yún)門rue或空,表示考慮當(dāng)前語(yǔ)言環(huán)境設(shè)置。
用戶的首選編碼用于python的open()函數(shù)讀寫文件的默認(rèn)編碼。
示例
>>> import locale >>> locale.getpreferredencoding() 'cp936' >>> locale.getpreferredencoding(False) 'cp936'
1.2.2 獲取梯的編碼字節(jié)串
>>> '梯'.encode()
b'\xe6\xa2\xaf'
>>> '梯'.encode('utf-8')
b'\xe6\xa2\xaf'
>>> '梯'.encode('gbk')
b'\xcc\xdd'
>>> '梯'.encode('cp936')
b'\xcc\xdd'
# utf-16 帶小端字節(jié)序
>>> '梯'.encode('utf-16')
b'\xff\xfe\xafh'
# utf-16 忽略小端字節(jié)序(little BOM)
>>> '梯'.encode('utf-16-le')
b'\xafh'
1.2.3 python3.x讀寫文件默認(rèn)編碼
描述
python3.x通過(guò)文本模式的open()打開(kāi)文件,
encoding未傳時(shí),默認(rèn)編碼取locale.getpreferredencoding(False)。
open().encoding獲取文件對(duì)象的編碼方式。
open()打開(kāi)文件時(shí)指定encoding編碼格式。
示例
>>> fpath='temp.txt'
# open()函數(shù)encoding未傳時(shí)默認(rèn)編碼取 locale.getpreferredencoding(False)
# 'r+' 文本模式打開(kāi)文件
>>> f=open(fpath,'r+')
# f.encoding 獲取文件對(duì)象的編碼方式
>>> f.encoding
'cp936'
# 文件指針會(huì)停留在文件結(jié)尾
>>> f.write('梯')
1
# 文件指針移動(dòng)到開(kāi)頭
>>> f.seek(0)
0
>>> f.read()
'梯'
>>> f.close()
# 'rb' 二進(jìn)制模式直接讀取文件的字節(jié)串
# 與 cp936 編碼一致
>>> open(fpath,'rb').read()
b'\xcc\xdd'
# 通過(guò) 相同的編碼 cp936或gbk 讀取文件內(nèi)容
>>> open(fpath,'r',encoding='cp936').read()
'梯'
>>> open(fpath,'r',encoding='gbk').read()
'梯'
>>> open(fpath,'r',encoding='utf-8').read()
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
open(fpath,'r',encoding='utf-8').read()
File "D:\python3\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte
1.2.4 python2.x讀寫文件默認(rèn)編碼
描述
python2.x通過(guò)文本模式的open()打開(kāi)文件,沒(méi)有encoding入?yún)ⅲ?/p>
寫文件時(shí)默認(rèn)編碼取locale.getpreferredencoding(False),
讀文件時(shí)直接讀取字節(jié)串。
python2.x通過(guò)codecs.open(encoding)指定文件編碼格式。
如果要向文件寫入write中文,需用Unicode字符串,通過(guò)u’梯’進(jìn)行創(chuàng)建后寫入。
示例
# python2.x內(nèi)置open()函數(shù)沒(méi)有encoding入?yún)?,無(wú)法指定編碼方法
>>> fpath='temp.txt'
>>> f=open(fpath,'w')
>>> f.write('a梯')
>>> f.close()
>>> open(fpath,'r').read()
'a\xcc\xdd'
# 'rb' 二進(jìn)制模式直接讀取文件的字節(jié)串
# 與 cp936 編碼一致
>>> open(fpath,'rb').read()
'a\xcc\xdd'
>>> len('a梯')
3
# python2.x通過(guò) codecs.open(encoding)指定編碼
>>> import codecs
>>> f=codecs.open(fpath,'w','utf-8')
# 寫入漢字時(shí)需要通過(guò)u'漢字'創(chuàng)建Unicode字符串
# 因?yàn)閜ython2.x解釋器默認(rèn)編碼為ASCII碼,
# '梯'字符串str用操作系統(tǒng)cp936自動(dòng)編碼為 '\xcc\xdd'
# 解釋器需要對(duì)其解碼為Unicode,解碼時(shí) \xcc 不在ASCII范圍內(nèi),會(huì)報(bào)錯(cuò)
>>> f.write(u'梯')
>>> f.close()
# 'rb' 二進(jìn)制模式直接讀取文件的字節(jié)串
# 與 utf-8 編碼一致
>>> codecs.open(fpath,'rb').read()
'\xe6\xa2\xaf'
1.3 python3.x處理BOM
描述
文件開(kāi)始的字節(jié)順序標(biāo)記(BOM,Byte Order Mark)。
UTF-8的BOM:’\xef\xbb\xbf’,對(duì)應(yīng)Unicode:'\ufeff’。
UTF-16的小端BOM:’ \xff\xfe’ 對(duì)應(yīng)Unicode: ‘\ufeff’。
| NO | 寫文件 | 文件開(kāi)頭帶BOM讀文件 | |
|---|---|---|---|
| 1 | UTF-8 | 文件開(kāi)頭不添加BOM | 顯示BOM的Unicode |
| 2 | UTF-8-sig | 文件開(kāi)頭添加BOM | 不顯示BOM |
| 3 | UTF-16 | 文件開(kāi)頭默認(rèn)添加當(dāng)前系統(tǒng)字節(jié)序BOM | 不顯示BOM |
| 4 | UTF-16-le | 文件開(kāi)頭不添加BOM | 顯示BOM的Unicode |
示例
>>> fpath='utf8bom.txt'
# encoding='utf-8-sig', 寫文件時(shí),會(huì)在文件開(kāi)頭加入 字節(jié)順序標(biāo)記
>>> open(fpath,'w',encoding='utf-8-sig').write('梯')
1
>>> open(fpath,'rb').read()
b'\xef\xbb\xbf\xe6\xa2\xaf'
>>> open(fpath,'r',encoding='utf-8').read()
'\ufeff梯'
# encoding='utf-8-sig', 讀文件時(shí),忽略字節(jié)順序標(biāo)記
>>> open(fpath,'r',encoding='utf-8-sig').read()
'梯'
>>> import sys
# sys.byteorder 當(dāng)前系統(tǒng)的字節(jié)序, 'little'(小端)或 'big'(大端)
>>> sys.byteorder
'little'
# 寫文件時(shí),encoding='utf-16' ,默認(rèn)添加當(dāng)前系統(tǒng)字節(jié)序(little)
>>> open(fpath,'w',encoding='utf-16').write('梯')
1
# 二進(jìn)制模式,讀取實(shí)際存放字節(jié)串,utf-16小端字節(jié)序?yàn)?\xff\xfe
>>> open(fpath,'rb').read()
b'\xff\xfe\xafh'
>>> open(fpath,'r',encoding='utf-16').read()
'梯'
# encoding='utf-16-le',讀文件時(shí),忽略字節(jié)順序標(biāo)記
>>> open(fpath,'r',encoding='utf-16-le').read()
'\ufeff梯'
# encoding='utf-16-le',寫文件時(shí),不添加BOM
>>> open(fpath,'w',encoding='utf-16-le').write('梯')
1
>>> open(fpath,'rb').read()
b'\xafh'
>>> open(fpath,'r',encoding='utf-16-le').read()
'梯'
# encoding='utf-16-le',寫文件后,不能用 utf-16 讀取
>>> open(fpath,'r',encoding='utf-16').read()
Traceback (most recent call last):
File "<pyshell#102>", line 1, in <module>
open(fpath,'r',encoding='utf-16').read()
File "D:\python3\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
File "D:\python3\lib\encodings\utf_16.py", line 67, in _buffer_decode
raise UnicodeError("UTF-16 stream does not start with BOM")
UnicodeError: UTF-16 stream does not start with BOM
到此這篇關(guān)于python3.x讀寫文件及BOM處理詳解的文章就介紹到這了,更多相關(guān)python3.x讀寫文件及BOM處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# DataGridView行列轉(zhuǎn)換的具體實(shí)現(xiàn)
本文主要介紹了C# DataGridView行列轉(zhuǎn)換的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
如何通過(guò)Python實(shí)現(xiàn)標(biāo)簽云算法
這篇文章主要介紹了如何通過(guò)Python實(shí)現(xiàn)標(biāo)簽云算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python正則表達(dá)式匹配[]中間為任意字符的實(shí)例
今天小編就為大家分享一篇python正則表達(dá)式匹配[]中間為任意字符的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Pytorch使用CUDA流(CUDA?stream)的實(shí)現(xiàn)
本文主要介紹了Pytorch使用CUDA流(CUDA?stream)的實(shí)現(xiàn),CUDA流是在GPU上并行執(zhí)行操作的一種機(jī)制,通過(guò)使用CUDA流,可以將不同的操作分配給不同的流,在不同的流上并行執(zhí)行這些操作,從而提高代碼的性能2023-12-12
解決python寫的windows服務(wù)不能啟動(dòng)的問(wèn)題
使用py2exe生成windows服務(wù)在win7下可以正常運(yùn)行,但是到了xp下面可以安裝,但是無(wú)法啟動(dòng)2014-04-04
python使用循環(huán)實(shí)現(xiàn)批量創(chuàng)建文件夾示例
這篇文章主要介紹了python使用循環(huán)實(shí)現(xiàn)批量創(chuàng)建文件夾示例,需要的朋友可以參考下2014-03-03
Django框架用戶注銷功能實(shí)現(xiàn)方法分析
這篇文章主要介紹了Django框架用戶注銷功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了基于Django框架的刪除cookie實(shí)現(xiàn)用戶注銷功能的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
Python實(shí)現(xiàn)AES加密,解密的兩種方法
這篇文章主要介紹了Python實(shí)現(xiàn)AES加密,解密的兩種方法,幫助大家更好的使用python加解密文件,感興趣的朋友可以了解下2020-10-10

