欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python3.x讀寫文件及BOM處理詳解

 更新時間:2024年01月04日 15:53:39   作者:梯閱線條  
這篇文章主要為大家詳細介紹了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讀文件
1UTF-8文件開頭不添加BOM顯示BOM的Unicode
2UTF-8-sig文件開頭添加BOM不顯示BOM
3UTF-16文件開頭默認添加當前系統(tǒng)字節(jié)序BOM不顯示BOM
4UTF-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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論