在Python 3中,當我打開一個帶有模式字符串'rb'的文本文件,然後執行f.read()時,我驚訝地發現文件內容用單引號引起來在字符'b'之後。在二進制模式下的Python 3文件輸入更改
在Python 2中,我只是獲取文件內容。
我確定這是衆所周知的,但我在doco中找不到它的任何內容。有人能指出我嗎?
在Python 3中,當我打開一個帶有模式字符串'rb'的文本文件,然後執行f.read()時,我驚訝地發現文件內容用單引號引起來在字符'b'之後。在二進制模式下的Python 3文件輸入更改
在Python 2中,我只是獲取文件內容。
我確定這是衆所周知的,但我在doco中找不到它的任何內容。有人能指出我嗎?
你也可以在Python 3中獲得「只是文件內容」。無論如何,你很可能只是繼續做你正在做的事情。請繼續閱讀以獲得更長的解釋:
b「表示結果值爲bytes
字符串。 A bytes
-string與普通字符串非常相似,但並不完全,用於處理二進制,非文本數據。
一些對二進制數據沒有意義的字符串方法不見了,但大多數方法仍然存在。一個很大的區別是,當你從bytes
字符串得到一個特定字節時,你會得到一個整數,而對於一個普通的str
,你會得到一個長度爲str
的長度。
>>> b'foo'[1]
111
>>> 'foo'[1]
'o'
如果以文本模式打開文件,用「T」標誌,你得到一個str
回來。 Python 3 str
是Python 2中被稱爲unicode
的內容。它用於處理文本數據。
您使用.encode()
和.decode
方法在bytes
和str
之間來回轉換。
首先,Python 2 str
類型已在Python 3中重命名爲bytes
,字節文字使用前綴b''
。 Python 2 unicode
類型是新的Python 3 str
類型。
要獲得Python 2中的Python 3文件行爲,您需要使用io.open()
或codecs.open()
;默認情況下,Python 3將文本文件解碼爲Unicode 。
你看到的是,對於二進制文件,Python 3中爲您提供了同樣的事情如在Python 2,即字節字符串。然後改變的是,字節字符串的repr()
前綴爲b
,並且print()
函數將使用傳遞給它的任何對象的repr()
表示,除了unicode值。
要使用print()
函數將您的二進制數據打印爲unicode文本,請先將其解碼爲unicode。但是,你可能已經打開文件而不是文本文件。
bytes
類型有一些其他改進,以反映您正在處理二進制數據,而不是文本。例如,對單個字節進行索引或遍歷bytes
值可以獲得int
值(0到255之間),而不是字符。
用17秒打敗你! ;-)無論如何,Python 3'bytes'和Python 2'str'並不完全一樣。差不多。 :-) –
是的,索引訪問也得到了改善。 –
有時我們需要(需要?)知道文本文件是單字符換行符(0A)還是雙字符換行符(0D0A)。
我們通過以二進制模式打開文本文件,識別0D和0A,並將其他字節視爲普通文本字符來避免混淆。
可以通過查找所有二進制模式讀取並使用新函數oldread()刪除所添加的材料來替代它們來移植此類代碼,但這有點痛苦。
我想Python的神學家們認爲保持'rb'的樣子,併爲新行爲添加一個新的'rx'或其他東西。只是廢除某些東西似乎有點霸道。
但是,在那裏,這個問題肯定通過在Lennert的文檔中搜索'rb'來回答。
http://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit是否合適? – TerryA
任何從Python 2切換到Python 3的人都應閱讀http://python3porting.com/。這不是那麼大。 :-) –