2013-04-03 99 views
0

我的問題是關於python 3.0字符串。python字符串和二進制數據

  1. 我的理解是,對於線str = "a",所述字符內「A」進行編碼(使用UTF-8 - 例如),並存儲在STR對象。如果'a'的UTF-8表示是1個字節,則該字符串的長度爲1個字節。我對嗎?

  2. 如果以上情況屬實,當我們使用read()讀取二進制文件時會發生什麼情況。假設我有一個二進制數據的兩個字節兩個字節的文件,我在使用字符串讀它讀命令一樣

    open(fileName, mode='rb') 
        str= file.read() 
    

    現在str將是兩個字節長,每個字節會是怎樣被存儲在文件名。我對嗎?

  3. 如果我在上述方面是正確的,那麼str對象不是以任何特定的編碼格式(如UTF等),那麼這意味着python字符串總是unicode?另外如果我調用str.encode()會發生什麼。這將沒有意義?

  4. 由於從文件讀取的str對象實際上是一個字節數組。有什麼辦法將其轉換爲bytearray類型?

+1

您確實需要閱讀[Python Unicode HOWTO](http://docs.python.org/3/howto/unicode.html)和[本文](http://joelonsoftware.com/文章/ Unicode.html)爲好措施。 –

+2

你真的不想給你的字符串命名'str'。特別是因爲你在問'str'和'bytes'對象,這使得它更容易混淆而不僅僅是隱藏內置對象。 – geoffspear

回答

2

你很困惑。 「編碼」屬於字節字符串,而不是Unicode字符串。有意義的語句:「這個字節串是utf-8編碼的。」,「這個字節串是2個字節長。「無意義的語句: 」這Unicode字符串是UTF-8編碼「, 」這Unicode字符串是2個字節長的「

  1. str = "a"表示 」創建一個unicode字符串 'A' 和對它的引用名爲str「 的Unicode。字符串當然是在某些編碼中存儲爲,因爲它需要以字節的形式存在於內存中,但這並不相關,所有的代碼將它看作完全沒有編碼 - 它已經從字節抽象出來。 unicode字符串是unicode代碼點序列(即代表字符的整數)
  2. 是和否str這裏(返回值o f read())是字節字符串,而不是unicode字符串"a" != b"a"
  3. 你的字節串str擁有一個未知編碼並且必須是解碼產生一個unicode字符串。字節字符串沒有encode()方法,因爲它沒有意義 - 它們已經是unicode字符串的編碼,或者它們根本不代表unicode字符串(例如圖像)。
  4. 它不是一個字節數組,它是一個字節串。 A bytearray可變的字節列表。您可以使用bytearray(byte_string)生成一個字節數組,但bytearrays用於相當專業的用途(例如,爲了避免複製send-recv緩衝區),而不是隨意使用。通常你只需要一個字節字符串。
0

當你讀到二進制模式文件,從read()方法的返回值是一個bytes對象,而不是str對象。該文件深入介紹了這一點。

>>> with open('foo', mode='rb') as f: s = f.read() 
... 
>>> s 
b'abc\n' 
>>> len(s) 
4 
>>> type(s) 
<class 'bytes'> 
0

Python字符串店Unicode代碼點

Codepoints與字節不同。字節是數字的計算機表示(通常在0到255之間),並且這些數字可以通過解碼過程轉換爲碼點,並且在編碼的另一個方向轉換爲碼點。 Python 3字符串包含代碼點,文本中的每個字符都有一個代碼點。

Python源代碼可以使用一系列字節定義字符串文字,解碼器默認使用UTF-8編解碼器解碼爲unicode,但您可以在文件頂部設置其他編解碼器。在磁盤上,採用UTF-8編碼的字母a確實只是一個字節,這就是UTF-8標準的性質。

如果您在文本模式下閱讀文件,Python會自動爲您應用解碼過程,但是當您以二進制模式打開它時,將不會執行解碼,而會得到一個bytes對象。該對象的內容應該完全反映文件的內容。請注意,它是而不是類型str,它不是Unicode,它甚至不是Python字符串。要將字節轉換爲字符串,您需要使用.decode()方法進行明確解碼。

A bytearraybytes的值簡單創建,只需調用bytesarray()就可以了。