mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别
從Python發展歷史談起
Python3和Python2表示字符序列的方式有所不同。
- Python3字符序列的兩種表示為byte和str。前者的實例包含原始的8位值,即原始的字節;后者的實例包括Unicode字符。
- Python2字符序列的兩種表示為str和unicode。與Python3不同的是,str實例包含原始的8位值;而unicode的實例,則包含Unicode字符。
類型轉換
把Unicode字符表示為二進制數據有許多方法。做常見的編碼方式是UTF-8。但是python3的str實例和Python2的unicode實例都沒有和特定的二進制編碼形式相關聯。要想把Unicode字符轉換為二進制數據,就必須使用encode方法。要想把二進制數據轉換成Unicode字符,則必須使用decode方法。
因此,在編寫大型復雜的Python程序的時候,一般把編碼和解碼的相關操作放到最外層來做。程序核心部分使用Unicode字符類型,也就是Python3的str以及Python2的unicode,而且不要對字符編碼做任何假設。這種辦法既可以讓程序接受多種類型的文本編碼,又可以保證輸出的文本信息只采用一種編碼形式(最好是UTF-8),靈活性很高。
所以,可以編寫兩個輔助函數,以便對序列進行轉換,使得轉換后的輸入數據符合開發者預期。
對于Python3
在Python3中,我們需要編寫一個接收str或bytes,并總是返回str的方法:
def to_str(bytes_or_str):if isinstance(bytes_or_str, bytes):return bytes_or_str.decode('utf-8')return bytes_or_str # instance of str以及一個總是返回bytes的方法:
def to_bytes(bytes_or_str):if isinstance(bytes_or_str, str):return bytes_or_str.encode('utf-8')return bytes_or_str # instance of bytes對于Python2
在Python2中,我們需要編寫一個接收str或unicode,并總是返回unicode的方法:
def to_unicode(unicode_or_str):if isinstance(unicode_or_str, str):return unicode_or_str.decode('utf-8')return unicode_or_str # instance of unicode以及一個總是返回str的方法:
def to_str(unicode_or_str):if isinstance(unicode_or_str, unicode):return unicode_or_str.encode('utf-8')return unicode_or_str # instance of str面臨的問題
在Python中使用原始8位值與Unicode字符時,通常有兩個問題需要注意。
第一個問題
第一個問題通常出現在Python2中,如果你用的是Python3,可以暫且忽略這個問題。
如果str只包含7位的ASCII字符,那么unicode和str實例似乎就成了同一種類型。
- 可以用+操作符把str與unicode連接起來
- 可以進行比較操作比如, ==、!=、<、>
這些行為一位著,只處理7位的ASCII的情況下,如果某個函數接受str,那么可以給它傳入unicode;如果某個函數接收unicode,也可以傳入str。而在Python3中,bytes和str實例絕對不會等價,更不能進行比較,即使是空字符串也不可以,因為這是完全不同的兩個類型。所以,在傳入字符序列的時候必須留意其類型。
第二個問題
第二個問題可能會出現在Python3上,也是經常遇到的一些問題。
如果通過內置的open函數獲取謳歌文件句柄,那么需要注意的是,該句柄默認會采用UTF-8編碼格式來操作文件。而在Python2中,文件操作的默認格式是二進制的,這可能會導致程序出現奇怪的錯誤。
例如,現在要向文件中隨機寫入二進制數據,下面這個寫法在Python2中不會有什么問題,但在Python3中會有異常,提示TypeError: write() argument must be str, not bytes
with open('./random.bin', 'w') as f:f.write(os.urandom(10))>>> TypeError: write() argument must be str, not bytes發生上述問題的原因是Python3給open函數添加了encode參數,而這個新參數的默認值是UTF-8。這樣一來,系統就會要求開發者必須傳入包含Unicode字符的str實例,而不是包含二進制數據的bytes實例。
為了解決這個問題,我們必須用二進制寫入模式,即將原來的'w'修改為'wb',這樣一來就可以同時適配Python2和Python3。從文件中讀取數據的時候也會有類似的問題,解決方法與寫入類似,使用'rb'模式打開文件,而不是'r'模式。
總結
參考閱讀:
《Effective Python》
總結
以上是生活随笔為你收集整理的mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可转债属于高风险还是低风险?
- 下一篇: 股票年报前会停盘吗?