python3.x讀寫文件及BOM處理詳解
1 python3.x讀寫文件及BOM處理
1.1 python3.x讀取和寫入Unicode
python3.x的字符串為unicode,可以調(diào)用encode()方法手動將字符串編碼為字節(jié)串(原始字節(jié)),也可以通過文件輸入輸出自動編碼。
1.1.1 手動編碼
描述
python3.x的字符串通過encode(編碼名)方法,將字符串轉(zhuǎn)換為原始字節(jié)串。
示例
>>> s='梯' # python3.x 字符串 str 對應 unicode >>> s,type(s) ('梯', <class 'str'>) >>> s_gbk=s.encode('gbk') >>> s_utf8=s.encode('utf-8') # 1個漢字,gbk編碼為2個字節(jié), utf-8 編碼為3個字節(jié) # 2位16進制 占1個字節(jié) >>> s_gbk,s_utf8 (b'\xcc\xdd', b'\xe6\xa2\xaf') >>> len(s_gbk),len(s_utf8) (2, 3)
1.1.2 寫文件編碼
描述
open寫文件時,指定的encoding為文件保存到磁盤時的編碼格式。
示例
# 寫文件時 encoding 表示文件存儲到磁盤的編碼格式 >>> open('gbk.txt','w',encoding='gbk').write('梯') 1 >>> open('utf8.txt','w',encoding='utf-8').write('梯') 1 # 'rb' 二進制模式,讀取文件內(nèi)容為bytes類型,為文件實際存儲的字節(jié)串 # gbk編碼,1個中文占2個字節(jié) >>> open('gbk.txt','rb').read() b'\xcc\xdd' # utf-8編碼,1個中文占3個字節(jié) >>> open('utf8.txt','rb').read() b'\xe6\xa2\xaf'
1.1.3 讀文件編碼
描述
open讀文件時,指定的encoding為解釋器讀取文件字節(jié)串解碼使用的編碼格式。
示例
# 讀文件時 encoding 表示解釋器讀取文件字節(jié)串解碼使用的編碼格式 # 需與文件存儲時編碼格式相同 >>> 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' # 二進制模式,讀取文件內(nèi)容后進行手動解碼 # python3.x 解釋器默認編碼為utf-8 >>> dgbk.decode('gbk');dutf8.decode() '梯' '梯'
1.2 python讀寫文件默認編碼
1.2.1 locale.getpreferredencoding()
用法
import locale locale.getpreferredencoding()
描述
python的locale**.getpreferredencoding()**用于獲取用戶的首選編碼。
入?yún)镕alse,表示不使用任何額外設置。
入?yún)門rue或空,表示考慮當前語言環(huán)境設置。
用戶的首選編碼用于python的open()函數(shù)讀寫文件的默認編碼。
示例
>>> 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讀寫文件默認編碼
描述
python3.x通過文本模式的open()打開文件,
encoding未傳時,默認編碼取locale.getpreferredencoding(False)。
open().encoding獲取文件對象的編碼方式。
open()打開文件時指定encoding編碼格式。
示例
>>> fpath='temp.txt' # open()函數(shù)encoding未傳時默認編碼取 locale.getpreferredencoding(False) # 'r+' 文本模式打開文件 >>> f=open(fpath,'r+') # f.encoding 獲取文件對象的編碼方式 >>> f.encoding 'cp936' # 文件指針會停留在文件結(jié)尾 >>> f.write('梯') 1 # 文件指針移動到開頭 >>> f.seek(0) 0 >>> f.read() '梯' >>> f.close() # 'rb' 二進制模式直接讀取文件的字節(jié)串 # 與 cp936 編碼一致 >>> open(fpath,'rb').read() b'\xcc\xdd' # 通過 相同的編碼 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讀寫文件默認編碼
描述
python2.x通過文本模式的open()打開文件,沒有encoding入?yún)ⅲ?/p>
寫文件時默認編碼取locale.getpreferredencoding(False),
讀文件時直接讀取字節(jié)串。
python2.x通過codecs.open(encoding)指定文件編碼格式。
如果要向文件寫入write中文,需用Unicode字符串,通過u’梯’進行創(chuàng)建后寫入。
示例
# python2.x內(nèi)置open()函數(shù)沒有encoding入?yún)ⅲ瑹o法指定編碼方法 >>> fpath='temp.txt' >>> f=open(fpath,'w') >>> f.write('a梯') >>> f.close() >>> open(fpath,'r').read() 'a\xcc\xdd' # 'rb' 二進制模式直接讀取文件的字節(jié)串 # 與 cp936 編碼一致 >>> open(fpath,'rb').read() 'a\xcc\xdd' >>> len('a梯') 3 # python2.x通過 codecs.open(encoding)指定編碼 >>> import codecs >>> f=codecs.open(fpath,'w','utf-8') # 寫入漢字時需要通過u'漢字'創(chuàng)建Unicode字符串 # 因為python2.x解釋器默認編碼為ASCII碼, # '梯'字符串str用操作系統(tǒng)cp936自動編碼為 '\xcc\xdd' # 解釋器需要對其解碼為Unicode,解碼時 \xcc 不在ASCII范圍內(nèi),會報錯 >>> f.write(u'梯') >>> f.close() # 'rb' 二進制模式直接讀取文件的字節(jié)串 # 與 utf-8 編碼一致 >>> codecs.open(fpath,'rb').read() '\xe6\xa2\xaf'
1.3 python3.x處理BOM
描述
文件開始的字節(jié)順序標記(BOM,Byte Order Mark)。
UTF-8的BOM:’\xef\xbb\xbf’,對應Unicode:'\ufeff’。
UTF-16的小端BOM:’ \xff\xfe’ 對應Unicode: ‘\ufeff’。
NO | 寫文件 | 文件開頭帶BOM讀文件 | |
---|---|---|---|
1 | UTF-8 | 文件開頭不添加BOM | 顯示BOM的Unicode |
2 | UTF-8-sig | 文件開頭添加BOM | 不顯示BOM |
3 | UTF-16 | 文件開頭默認添加當前系統(tǒng)字節(jié)序BOM | 不顯示BOM |
4 | UTF-16-le | 文件開頭不添加BOM | 顯示BOM的Unicode |
示例
>>> fpath='utf8bom.txt' # encoding='utf-8-sig', 寫文件時,會在文件開頭加入 字節(jié)順序標記 >>> 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', 讀文件時,忽略字節(jié)順序標記 >>> open(fpath,'r',encoding='utf-8-sig').read() '梯' >>> import sys # sys.byteorder 當前系統(tǒng)的字節(jié)序, 'little'(小端)或 'big'(大端) >>> sys.byteorder 'little' # 寫文件時,encoding='utf-16' ,默認添加當前系統(tǒng)字節(jié)序(little) >>> open(fpath,'w',encoding='utf-16').write('梯') 1 # 二進制模式,讀取實際存放字節(jié)串,utf-16小端字節(jié)序為 \xff\xfe >>> open(fpath,'rb').read() b'\xff\xfe\xafh' >>> open(fpath,'r',encoding='utf-16').read() '梯' # encoding='utf-16-le',讀文件時,忽略字節(jié)順序標記 >>> open(fpath,'r',encoding='utf-16-le').read() '\ufeff梯' # encoding='utf-16-le',寫文件時,不添加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
到此這篇關于python3.x讀寫文件及BOM處理詳解的文章就介紹到這了,更多相關python3.x讀寫文件及BOM處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C# DataGridView行列轉(zhuǎn)換的具體實現(xiàn)
本文主要介紹了C# DataGridView行列轉(zhuǎn)換的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02Pytorch使用CUDA流(CUDA?stream)的實現(xiàn)
本文主要介紹了Pytorch使用CUDA流(CUDA?stream)的實現(xiàn),CUDA流是在GPU上并行執(zhí)行操作的一種機制,通過使用CUDA流,可以將不同的操作分配給不同的流,在不同的流上并行執(zhí)行這些操作,從而提高代碼的性能2023-12-12python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例
這篇文章主要介紹了python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例,需要的朋友可以參考下2014-03-03