字元串也是序列的一種。本篇主要介紹一些字元串的不同于序列的基本操作的相關知識。
字元編碼方法
大多數程式員把字元串看作是用來表示文本資料的一系列字元。但是,根據必須記錄何種字元集,計算機記憶體中存儲字元的方式有所不同。
本文僅僅涉及 python 3.x
在 python 3.x 中,有 \(3\) 種字元串類型:
<code>str</code>:用于 unicode 文本 (ascii 或其他更寬的);(ascii 看作 unicode 的一種簡單類型)
<code>bytes</code>:用于二進制資料 (包括編碼的文本);
<code>bytearray</code>:是一種可變的 <code>bytes</code> 類型。
所見即所得,例如
ascii碼:每個字元都是以 \(7\) 位二進制數的方式存儲在計算機内,asci 字元隻能表示 \(95\) 個可列印字元。
unicode:通過使用一個或多個位元組來表示一個字元的方式突破了 ascii 碼的限制。
ascii 标準在美國建立,并且定義了大多數美國程式員使用的文本字元串表示法。ascii 定義了從 \(0\) 到 \(127\) 的字元代碼,并且允許每個字元存儲在一個 \(8\) 位的位元組中(實際上,隻有其中的 \(7\) 位真正用到)。例如,ascii 标準把字元 <code>'a'</code> 映射為整數值 <code>97</code>(十六進制中 的 <code>0x61</code>),它存儲在記憶體和檔案的一個單個位元組中。如果想要看到這是如何工作的, python 的内置函數 <code>ord</code> 給出了一個字元的二進制值,并且 <code>chr</code> 針對一個給定的整數代碼值 傳回其字元:
為了容納特殊字元,一些标準允許一個8位位元組中的所有可能 的值(即 \(0\sim 255\))來表示字元,并且把(ascii 範圍之外的)值 \(128\) 到 \(255\) 配置設定給特殊字元。這樣的一個标準叫做 latin-1,廣泛地用于西歐地區。在 latin-1 中,\(127\) 以上的字元 代碼配置設定給了重音和其他特殊字元。例如,配置設定給位元組值 <code>196</code> 的字元,是一個特殊标記 的非 ascii 字元:
然而,一些字母表定義了如此多的字元,以至于無法把其中的每一個都表示成一個位元組。unicode 考慮到更多的靈活性。unicode 文 本通常叫做“寬字元”字元串,因為每個字元可能表示為多個位元組。unicode 通常用在國際化的程式中,以表示歐洲和亞洲的字元集,它們往往擁有比 \(8\) 位位元組所能表示的更多的字元。
更程式化地說,位元組和字元串之間的來回轉換由兩個術語定義:
編碼: 是根據一個想要的編碼名稱,把一個字元串翻譯為其原始位元組形式。
解碼: 是根據其編碼名稱,把一個原始位元組串翻譯為字元串形式的過程。
也就是說,我們從字元串編碼為原始位元組,并且從原始位元組解碼為字元串。
由于編碼的字元映射把字元配置設定給同樣的代碼以保持相容性,是以 ascii 是 latin-1 和 utf-8 的子集。也就是說,一個有效的 ascii 字元串也是一個有效的 latin-1 和 utf-8 編碼字元串。當資料存儲到檔案中的時候,這也是成立的:每個 ascii 檔案也是有效的 utf-8 檔案,因為 ascii 是 utf-8 的一個 \(7\) 位的子集。 ascii、latin-1、utf-8 以及很多其他的編碼,都被認為是 unicode。
文 本 文 件 當一個檔案以文本模式打開的時候,讀取其資料會自動将其内容解碼(每個平台一個預設的或一個提供的編碼名稱),并且将其傳回為一個<code>str</code>,寫入會接受一個 <code>str</code>,并且在将其傳輸到檔案之間自動編碼它。文本模式的檔案還支援統一的行尾 轉換和額外的編碼特定參數。根據編碼名稱,文本檔案也自動處理檔案開始處的位元組順序标記序列。
二 進 制 文 件 通過在内置的<code>open</code> 調用的模式字元串參數添加一個 <code>b</code>(隻能小寫),以二進制模式 打開一個檔案的時候,讀取其資料不會以任何方式解碼它,而是直接傳回其内容 <code>raw</code> 并且未經修改,作為一個 <code>bytes</code> 對象;寫入類似地接受一個 <code>bytes</code> 對象,并且将其傳送到檔案中而未經修改。二進制模式檔案也接受一個bytearray對象作為寫入 檔案中的内容。
由于 <code>str</code> 和 <code>bytes</code> 之間的語言差距明顯,是以必須确定資料本質上是文本或二進制,并且 在腳本中相應地使用 <code>str</code> 或 <code>bytes</code> 對象來表示其内容。最終,以何種模式打開一個檔案将 決定腳本使用何種類型的對象來表示其内容:
如果正在處理圖像檔案,其他程式建立的、而且必須解壓的打包資料,或者一些裝置資料流,則使用 <code>bytes</code> 和二進制模式檔案處理它更合适。
如果想要更新資料而不在記憶體中産生其副本,也可以選擇使用 <code>bytearray</code>。
如果你要處理的内容實質是文本的内容,例如程式輸出、html、國際化文本或 csv 或 xml 檔案,可能要使用 <code>str</code> 和文本模式檔案。
注意,内置函數 <code>open</code> 的模式字元串參數(函數的第二個參數)在 python 3.x 中變得至關重要,因為其内容不僅指定了一個檔案處理模式,而且暗示了一個 python 對象類型。 通過給模式字元串添加一個 <code>b</code>,我們可以指定二進制模式,并且當讀取或寫入的時候, 将要接收或者必須提供一個 <code>bytes</code> 對象來表示檔案的内容。沒有 <code>b</code>,我們的檔案将以文本模式處理,并且将使用 <code>str</code> 對象在腳本中表示其内容。例如,模式 <code>rb</code>、<code>wb</code> 和 <code>rb+</code> 暗示 <code>bytes</code>,而 <code>r</code>、<code>w+</code> 和 <code>rt</code> 暗示 <code>str</code>。
文本模式檔案也處理在某種編碼方案下可能出現在檔案開始處的位元組順序标記(byte order marker,bom)序列。例如,在 utf-16 和 utf-32 編碼中,bom指定大尾還是小尾格式(基本上,是确定一個位字元串的哪一端最重要)。
<code>bytes</code> 對象實際上是較小的整數的一個序列,盡管它盡可能地将自己的内容列印為字元:
python轉義字元
在需要在字元中使用特殊字元時,python用反斜杠(<code>\</code>)轉義字元。如下表:
轉義字元
描述
<code>\</code>(在行尾時)
續行符
<code>\\</code>
反斜杠符号
<code>\'</code>
單引号
<code>\"</code>
雙引号
<code>\a</code>
響鈴
<code>\b</code>
倒退(backspace)
<code>\e</code>
轉義
<code>\000</code>
空
<code>\n</code>
換行
<code>\v</code>
縱向制表符
<code>\t</code>
橫向制表符
<code>\r</code>
回車
<code>\f</code>
換頁
<code>\oyy</code>
八進制數,yy代表的字元,例如:<code>\o12</code>代表換行
<code>\xyy</code>
十六進制數,yy代表的字元,例如:<code>\x0a</code>代表換行
格式化操作
python字元串格式化符号:
符 号
<code>%c</code>
轉換成字元(ascii碼值或長度為1的字元串)
<code>%s</code>
優先使用<code>str()</code>函數進行字元串轉換
<code>%r</code>
優先使用<code>repr()</code>函數進行字元串轉換
<code>%u</code>
轉換為無符号十進制
<code>%d</code>
轉換為有符号十進制
<code>%o</code>
轉換為無符号八進制數
<code>%x</code>/<code>%x</code>
轉換為無符号十六進制數
<code>%f</code>
轉換為浮點數字,可指定小數點後的精度
<code>%e</code>/<code>%e</code>
用科學計數法格式化浮點數
<code>%g</code>
<code>%f和%e</code>的簡寫
<code>%f</code> 和 <code>%e</code> 的簡寫
<code>%p</code>
用十六進制數格式化變量的位址
<code>%%</code>
輸出<code>%</code>
格式化操作符輔助指令:
符号
功能
<code>*</code>
定義寬度或者小數點精度
<code>-</code>
用做左對齊
<code>+</code>
在正數前面顯示加号(<code>+</code> )
<code><sp></code>
在正數前面顯示空格
<code>#</code>
在八進制數前面顯示零(<code>'0'</code>),在十六進制前面顯示<code>'0x'</code>或者<code>'0x'</code>(取決于用的是<code>'x'</code>還是<code>'x'</code>)
<code>0</code>
顯示的數字前面填充<code>'0'</code>而不是預設的空格
<code>%</code>
<code>'%%'</code>輸出一個單一的<code>'%'</code>
<code>(var)</code>
映射變量(字典參數)
<code>m.n.</code>
<code>m</code> 是顯示的最小總寬度,<code>n</code> 是小數點後的位數(如果可用的話)
形式:
<code>format%values</code>
values的輸入形式:
元組形式
字典形式(鍵作為format出現,字典作為values存在)
字元串模闆
字元串對象template對象存在與string子產品中:
使用美元符号<code>$</code>定義<code>代替換的參數</code>
使用<code>substitute()</code>方法(缺少參數時會報錯,keyerror異常) & <code>safe_substitute()</code>方法(缺少key時,直接顯示參數字元串)進行參數替換
示例:
python 的字元串常用内建函數
參數:
<code>width</code>:字元串的總寬度
<code>fillchar</code>填充字元(預設為空格)
傳回值:
一個指定的寬度<code>width</code>居中的字元串
如果<code>width</code>小于字元串寬度直接傳回字元串,否則使用<code>fillchar</code>去填充
sub -- 搜尋的子字元串
start -- 字元串開始搜尋的位置。預設為第一個字元。
end -- 字元串中結束搜尋的位置。預設為字元串的最後一個位置。
encoding -- 要使用的編碼,如"utf-8"。
errors -- 設定不同錯誤的處理方案。預設為<code>'strict'</code>,意為編碼錯誤引起一個<code>unicodeerror</code>。 其他可能得值有 <code>'ignore'</code>, <code>'replace'</code>, <code>'xmlcharrefreplace'</code>, <code>'backslashreplace'</code> 以及通過 <code>codecs.register_error()</code> 注冊的任何值。
傳回該方法傳回解碼後的字元串。
python3 中<code>str</code>沒有<code>decode</code>方法,但是可以使用<code>bytes</code>對象的<code>decode()</code>方法來解碼給定的<code>bytes</code>對象,這個<code>bytes</code>對象可以由<code>str.encode()</code>來編碼傳回。
如果包含子字元串傳回開始的索引值,否則傳回-1。
return a string which is the concatenation of the strings in the
iterable.
關于<code>iterable</code>參考python——聊聊iterable,sequence和iterators
return a copy of the string s with leading and trailing whitespace removed.
if chars is given and not none, remove characters in chars instead.
return a copy of s with all occurrences of substring old replaced by new.
if the optional argument count is given, only the first count occurrences are replaced.
return a list of the words in s, using sep as the delimiter string.
if maxsplit is given, at most maxsplit splits are done.
if sep is not specified or is none, any whitespace string is a separator and empty strings are removed from the result.
['this', 'is', 'string', 'example....wow!!!']
['th', 's is string example....wow!!!']
['this is string example....', 'o', '!!!']
探尋有趣之事!