簡體   English   中英

python字符串和二進制數據

[英]python strings and binary data

我的問題是關於python 3.0字符串。

  1. 我的理解是,對於行str = "a" ,字符'a'被編碼(例如使用utf-8)並存儲在str對象中。 如果'a'的UTF-8表示是1字節,則字符串是1字節長。 我對嗎?

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

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

    現在str將是兩個字節長,每個字節將存儲在fileName中。 我對嗎?

  3. 如果我在上面的點是對的,那么str對象不是任何特定的編碼格式(如UTF等),那么python字符串總是unicode是什么意思呢? 如果我調用str.encode()會發生什么。 這沒有意義嗎?

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

你很困惑。 “編碼”屬於字節字符串 ,而不是unicode字符串 有意義的語句:“此字節字符串是utf-8編碼的。”,“此字節字符串長度為2個字節。” 無意義的語句:“這個unicode字符串是utf-8編碼的”,“這個unicode字符串是2個字節長”

  1. str = "a"表示“創建一個unicode字符串'a'和一個名為str的引用”。 Unicode字符串當然存儲在某種編碼中,因為它需要在內存中作為字節存在,但這並不重要。 您的所有代碼都將其視為根本沒有編碼 - 它已從字節中抽象出來。 unicode字符串是一系列unicode代碼點 (即表示字符的整數)。
  2. 是的,不是。 str here( read()的返回值)是字節字符串 ,而不是unicode字符串 "a" != b"a"
  3. 您的字節字符串str具有未知編碼 ,必須進行解碼才能生成unicode字符串。 字節字符串沒有encode()方法,因為它沒有意義 - 它們或者已經是unicode字符串的編碼,或者它們根本不表示unicode字符串(例如圖像)。
  4. 它不是一個字節數組,而是一個字節串。 bytearray是一個可變的字節列表。 您可以使用bytearray(byte_string)生成bytearray,但是bytearrays用於相當專業的用途(例如,避免復制send-recv緩沖區),而不是偶然使用。 通常你只需要一個字節串。

以二進制模式讀取文件時, read()方法返回的值是bytes對象,而不是str對象。 文檔深入介紹了這一點。

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

Python字符串存儲Unicode代碼點

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

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

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

bytes值中簡單地創建一個bytearray ,只需在其上調用bytesarray()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM