2013-07-05 49 views
1

在Python 3中,當我打開一個帶有模式字符串'rb'的文本文件,然後執行f.read()時,我驚訝地發現文件內容用單引號引起來在字符'b'之後。在二進制模式下的Python 3文件輸入更改

在Python 2中,我只是獲取文件內容。

我確定這是衆所周知的,但我在doco中找不到它的任何內容。有人能指出我嗎?

+2

http://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit是否合適? – TerryA

+0

任何從Python 2切換到Python 3的人都應閱讀http://python3porting.com/。這不是那麼大。 :-) –

回答

1

你也可以在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方法在bytesstr之間來回轉換。

1

首先,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之間),而不是字符。

+0

用17秒打敗你! ;-)無論如何,Python 3'bytes'和Python 2'str'並不完全一樣。差不多。 :-) –

+0

是的,索引訪問也得到了改善。 –

0

有時我們需要(需要?)知道文本文件是單字符換行符(0A)還是雙字符換行符(0D0A)。

我們通過以二進制模式打開文本文件,識別0D和0A,並將其他字節視爲普通文本字符來避免混淆。

可以通過查找所有二進制模式讀取並使用新函數oldread()刪除所添加的材料來替代它們來移植此類代碼,但這有點痛苦。

我想Python的神學家們認爲保持'rb'的樣子,併爲新行爲添加一個新的'rx'或其他東西。只是廢除某些東西似乎有點霸道。

但是,在那裏,這個問題肯定通過在Lennert的文檔中搜索'rb'來回答