Python中bytes和str的區(qū)別與聯(lián)系詳解
Bytes和Str的區(qū)別
在Python3中,字符序列有兩種類型:bytes和str。bytes類型是無符號的8位值(通常以ASCII碼顯式),而str類型是Unicode代碼點(code point)。代碼點指編碼字符集中,字符所對應(yīng)的數(shù)字。
a = b'hello world' print(isinstance(a, bytes)) print(list(a)) print(a) """ True [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100] b'hello world' """ a = 'hello world' print(isinstance(a, str)) print(list(a)) print(a) """ True ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] hello world """
isinstance()方法可以判斷對象的類型,例如這里用來判斷是str還是bytes。
Python3對文本(str)和二進(jìn)制數(shù)據(jù)(bytes)有著嚴(yán)格的區(qū)分,不能混用。
x = b'python'
y = b'java'
z = 'c++'
w = 'c'
print(x + y)
# b'pythonjava'
print(z + w)
# c++c
print(x + z)
# TypeError: can't concat str to bytes
print('python' == b'python')
# False
上述示例中str類型和bytes類型間使用=來比較是否相等不會報錯,但是會返回False。
Bytes與Str間的轉(zhuǎn)換
str類型和bytes類型間可以相互轉(zhuǎn)換。
str到bytes的轉(zhuǎn)換需要調(diào)用encode()方法。
bytes到str間的轉(zhuǎn)換需要調(diào)用decode()方法。
x = b'python' y = x.decode(encoding='utf-8') z = y.encode(encoding='utf-8') print(y) print(z) """ python b'python' """
可以觀察到encode()和decode()方法都有一個encoding參數(shù)用來指定具體的編碼規(guī)則。
讀寫文件的注意事項
當(dāng)要將bytes類型寫入到文件中時,必須指定mode=wb。讀取二進(jìn)制文件時可以指定mode=rb或者指定編碼方式,使用后者時讀出來的就不是bytes類型的字符序列了。
x = b'python'
# 錯誤示例
with open('data.bin', mode='w') as fp:
fp.write(x)
# TypeError: write() argument must be str, not bytes
# 正確示例
with open('data.bin', mode='wb') as fp:
fp.write(x)
# 讀取二進(jìn)制文件方式1
with open('data.bin', mode='rb') as fp:
content = fp.read()
print(content)
# python
# 讀取二進(jìn)制文件方式2
with open('data.bin', mode='r', encoding='utf-8') as fp:
content = fp.read()
print(content, type(content))
# python <class 'str'>
當(dāng)讀寫Unicode數(shù)據(jù)時,只需要注意下編碼方式即可,最好是顯式的傳遞encoding參數(shù)。
x = '世界你好'
with open('data.txt', mode='w', encoding='utf-8') as fp:
fp.write(x)
with open('data.txt', mode='r', encoding='utf-8') as fp:
content = fp.read()
print(content)
# 世界你好
# 錯誤示例,編碼方式不對
with open('data.txt', mode='r', encoding='gbk') as fp:
content = fp.read()
print(content)
# 涓栫晫浣犲ソ
總結(jié)
到此這篇關(guān)于Python中bytes和str區(qū)別與聯(lián)系的文章就介紹到這了,更多相關(guān)Python bytes和str區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch VGG11識別cifar10數(shù)據(jù)集(訓(xùn)練+預(yù)測單張輸入圖片操作)
這篇文章主要介紹了pytorch VGG11識別cifar10數(shù)據(jù)集(訓(xùn)練+預(yù)測單張輸入圖片操作),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python如何處理大數(shù)據(jù)?3個技巧效率提升攻略(推薦)
這篇文章主要介紹了Python如何處理大數(shù)據(jù)?3個技巧效率提升攻略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python實現(xiàn)將json文件生成C語言的結(jié)構(gòu)體的腳本分享
這篇文章主要為大家詳細(xì)介紹了Python如何實現(xiàn)將json文件生成C語言的結(jié)構(gòu)體,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-09-09
python數(shù)據(jù)庫操作--數(shù)據(jù)庫使用概述
這篇文章主要介紹了python中使用mysql數(shù)據(jù)庫詳細(xì)介紹,本文起講解了安裝mysql、安裝MySQL-python、mysql 的基本操作、python 操作mysql數(shù)據(jù)庫基礎(chǔ)等內(nèi)容,需要的朋友可以參考下2021-08-08

