python字符串與字符編碼
字符編碼
因為計算機只能處理數(shù)字,如果要處理文本,就必須先把文本轉換為數(shù)字才能處理祸穷。最早的計算機在設計時采用8個比特(bit)作為一個字節(jié)(byte)拓提,所以,一個字節(jié)能表示的最大的整數(shù)就是255(二進制11111111=十進制255)鸿吆,如果要表示更大的整數(shù)囤采,就必須用更多的字節(jié)。比如兩個字節(jié)可以表示的最大整數(shù)是65535惩淳,4個字節(jié)可以表示的最大整數(shù)是4294967295蕉毯。但是要處理中文顯然一個字節(jié)是不夠的,至少需要兩個字節(jié)思犁,而且還不能和ASCII編碼沖突代虾,所以,中國制定了GB2312編碼抒倚,用來把中文編進去褐着。加上其他國家也有很多各自的標準,就會不可避免地出現(xiàn)沖突托呕,結果就是含蓉,在多語言混合的文本中,顯示出來會有亂碼项郊。于是就出現(xiàn)了Unicode編碼馅扣,Unicode把所有語言都統(tǒng)一到一套編碼里,這樣就不會再有亂碼問題了着降。
Unicode標準也在不斷發(fā)展差油,但最常用的是用兩個字節(jié)表示一個字符(如果要用到非常偏僻的字符,就需要4個字節(jié))。現(xiàn)代操作系統(tǒng)和大多數(shù)編程語言都直接支持Unicode蓄喇。ASCII編碼和Unicode編碼的區(qū)別:ASCII編碼是1個字節(jié)发侵,而Unicode編碼通常是2個字節(jié)。比如字母A用ASCII編碼是十進制的65妆偏,二進制的01000001刃鳄;字符0用ASCII編碼是十進制的48,二進制的00110000钱骂,注意字符'0'和整數(shù)0是不同的叔锐;漢字 “中” 已經(jīng)超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013见秽,二進制的01001110 00101101愉烙。如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以解取,因此步责,A的Unicode編碼是00000000 01000001吊洼。新的問題又出現(xiàn)了:如果統(tǒng)一成Unicode編碼,亂碼問題從此消失了毛肋。但是原朝,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間玫坛,在存儲和傳輸上就十分不劃算。所以,本著節(jié)約的精神昆码,又出現(xiàn)了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個字節(jié)邻储,常用的英文字母被編碼成1個字節(jié)赋咽,漢字通常是3個字節(jié),只有很生僻的字符才會被編碼成4-6個字節(jié)吨娜。如果你要傳輸?shù)奈谋景罅坑⑽淖址洌肬TF-8編碼就能節(jié)省空間:
字符“A” 的 ASCII、Unicode宦赠、UTF-8 編碼依次是:01000001 陪毡、
00000000 01000001、01000001
字符“中”的ASCII勾扭、Unicode毡琉、UTF-8 編碼依次是:不能表示 、01001110 00101101 妙色、11100100 10111000 10101101
在計算機內(nèi)存中桅滋,統(tǒng)一使用Unicode編碼,當需要保存到硬盤或者需要傳輸?shù)臅r候身辨,就轉換為UTF-8編碼丐谋。
用記事本編輯的時候芍碧,從文件讀取的UTF-8字符被轉換為Unicode字符到內(nèi)存里,編輯完成后号俐,保存的時候再把Unicode轉換為UTF-8保存到文件泌豆。
python字符串
python中字符串是以單引號'或雙引號"括起來的任意文本,請注意萧落,''或""本身只是一種表示方式践美,不是字符串的一部分。字符串也是一種數(shù)據(jù)類型找岖,但是陨倡,字符串比較特殊的是還有一個編碼問題。在最新的Python 3版本中许布,字符串是以Unicode編碼的兴革,也就是說,Python的字符串支持多語言蜜唾。
對于單個字符的編碼杂曲,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉換為對應的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
如果知道字符的整數(shù)編碼袁余,還可以用十六進制這么寫str:
>>> '\u4e2d\u6587'
'中文'
由于Python的字符串類型是str擎勘,在內(nèi)存中以Unicode表示,一個字符對應若干個字節(jié)颖榜。如果要在網(wǎng)絡上傳輸棚饵,或者保存到磁盤上,就需要把str變?yōu)橐宰止?jié)為單位的bytes掩完。
Python對bytes類型的數(shù)據(jù)用帶b前綴的單引號或雙引號表示:
x = b'ABC'
要注意區(qū)分'ABC'和b'ABC'噪漾,前者是str,后者雖然內(nèi)容顯示得和前者一樣且蓬,但bytes的每個字符都只占用一個字節(jié)欣硼。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純英文的str可以用ASCII編碼為bytes恶阴,內(nèi)容是一樣的诈胜,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼存淫,因為中文編碼的范圍超過了ASCII編碼的范圍耘斩,Python會報錯。
在bytes中桅咆,無法顯示為ASCII字符的字節(jié)括授,用\x##顯示。
反過來,如果我們從網(wǎng)絡或磁盤上讀取了字節(jié)流荚虚,那么讀到的數(shù)據(jù)就是bytes薛夜。要把bytes變?yōu)閟tr,就需要用decode()方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
如果bytes中包含無法解碼的字節(jié)版述,decode()方法會報錯梯澜,如果bytes中只有一小部分無效的字節(jié),可以傳入errors='ignore'忽略錯誤的字節(jié):
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
由于Python源代碼也是一個文本文件渴析,所以晚伙,當你的源代碼中包含中文的時候,在保存源代碼時俭茧,就需要務必指定保存為UTF-8編碼咆疗。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取母债,我們通常在文件開頭寫上注釋午磁,告訴Python解釋器,按照UTF-8編碼讀取源代碼:
#-*- coding: utf-8 -*-
以上內(nèi)容參考引用自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000
python字符串運算符操作
a = "hello!"
b = "世界!"
#1毡们、根據(jù)下標獲取特定位置字符
print(a[0]) #獲取 a 的第一個字符迅皇,結果h
#2、字符串拼接
c = a+b
d = a*3
print(c) #結果 hello衙熔!世界登颓!
print(d) #結果 hello!hello!hello!
#3、切片
e = a[1:3] #獲取a 中 第二到第三個字符红氯,切片操作中執(zhí)行左閉右開原則挺据,這里即包含1,但不包括3
print(e) #結果 el
f = d[1:8:2] #切片操作可以加入步長脖隶,這里的2 就是步長,表示獲取d 的2到8位中的偶數(shù)位字符
print(f) #結果el!e
#4暇检、成員檢測
print("i" in d) #結果 Flase
print("i" not in d) #結果True
#5 在字符串前加上 r/R 所有的字符串都是直接按照字面的意思來使用,沒有轉義特殊或不能打印的字符产阱。
print(r"\n") #輸出\n,不是換行
python字符串格式化
Python 支持格式化字符串的輸出块仆,最基本的用法是將一個值插入到一個有字符串格式符 %s 的字符串中构蹬。
符號 | 描述 |
---|---|
%c | 格式化字符及其ASCII碼 |
%s | 格式化字符串 |
%d | 格式化整數(shù) |
%u | 格式化無符號整型 |
%o | 格式化無符號八進制數(shù) |
%x | 格式化無符號十六進制數(shù) |
%X | 格式化無符號十六進制數(shù)(大寫) |
%f | 格式化浮點數(shù)字,可指定小數(shù)點后的精度 |
%e | 用科學計數(shù)法格式化浮點數(shù) |
%E | 作用同%e悔据,用科學計數(shù)法格式化浮點數(shù) |
%g | %f和%e的簡寫 |
%G | %f 和 %E 的簡寫 |
%p | 用十六進制數(shù)格式化變量的地址 |
#基本用法
print ("我叫%s今年%d歲!" % ('小明', 10)) #結果我叫小明今年10歲!
#浮點數(shù)格式化
print ("保留兩位小數(shù):%.2f" % (1.2345)) #結果保留兩位小數(shù):1.23
#python3還提供一種格式化輸出方式 用format函數(shù)
print("我叫{0}今年{1}歲!身高{2:.2f}米".format("小明",16,1.72345) ) #結果我叫小明今年16歲!身高1.72米
python字符串內(nèi)建方法
序號 | 方法 | 描述 |
---|---|---|
1 | capitalize() | 將字符串的第一個字符轉換為大寫 |
2 | center(width, fillchar) | 返回一個指定的寬度 width 居中的字符串庄敛,fillchar 為填充的字符,默認為空格科汗。 |
3 | count(str, beg= 0,end=len(string)) | 返回 str 在 string 里面出現(xiàn)的次數(shù)藻烤,如果 beg 或者 end 指定則返回指定范圍內(nèi) str 出現(xiàn)的次數(shù) |
4 | bytes.decode(encoding="utf-8", errors="strict") | Python3 中沒有 decode 方法,但我們可以使用 bytes 對象的 decode() 方法來解碼給定的 bytes 對象,這個 bytes 對象可以由 str.encode() 來編碼返回怖亭。 |
5 | encode(encoding='UTF-8',errors='strict') | 以 encoding 指定的編碼格式編碼字符串涎显,如果出錯默認報一個ValueError 的異常,除非 errors 指定的是'ignore'或者'replace' |
6 | endswith(suffix, beg=0, end=len(string)) | 檢查字符串是否以 obj 結束兴猩,如果beg 或者 end 指定則檢查指定的范圍內(nèi)是否以 obj 結束期吓,如果是,返回 True,否則返回 False. |
7 | expandtabs(tabsize=8) | 把字符串 string 中的 tab 符號轉為空格倾芝,tab 符號默認的空格數(shù)是 8 讨勤。 |
8 | find(str, beg=0 end=len(string)) | 檢測 str 是否包含在字符串中,如果指定范圍 beg 和 end 晨另,則檢查是否包含在指定范圍內(nèi)潭千,如果包含返回開始的索引值,否則返回-1 |
9 | index(str, beg=0, end=len(string)) | 跟find()方法一樣拯刁,只不過如果str不在字符串中會報一個異常. |
10 | isalnum() | 如果字符串至少有一個字符并且所有字符都是字母或數(shù)字則返 回 True,否則返回 False |
11 | isalpha() | 如果字符串至少有一個字符并且所有字符都是字母則返回 True, 否則返回 False |
12 | isdigit() | 如果字符串只包含數(shù)字則返回 True 否則返回 False.. |
13 | islower() | 如果字符串中包含至少一個區(qū)分大小寫的字符脊岳,并且所有這些(區(qū)分大小寫的)字符都是小寫,則返回 True垛玻,否則返回 False |
14 | isnumeric() | 如果字符串中只包含數(shù)字字符割捅,則返回 True,否則返回 False(中文數(shù)字也可以) |
15 | isspace() | 如果字符串中只包含空白帚桩,則返回 True亿驾,否則返回 False. |
16 | istitle() | 如果字符串是標題化的(見 title())則返回 True,否則返回 False |
17 | isupper() | 如果字符串中包含至少一個區(qū)分大小寫的字符账嚎,并且所有這些(區(qū)分大小寫的)字符都是大寫莫瞬,則返回 True,否則返回 False |
18 | join(seq) | 以指定字符串作為分隔符郭蕉,將 seq 中所有的元素(的字符串表示)合并為一個新的字符串 |
19 | len(string) | 返回字符串長度 |
20 | ljust(width[, fillchar]) | 返回一個原字符串左對齊,并使用 fillchar 填充至長度 width 的新字符串疼邀,fillchar 默認為空格。 |
21 | lower() | 轉換字符串中所有大寫字符為小寫. |
22 | lstrip() | 截掉字符串左邊的空格或指定字符召锈。 |
23 | maketrans() | 創(chuàng)建字符映射的轉換表旁振,對于接受兩個參數(shù)的最簡單的調(diào)用方式,第一個參數(shù)是字符串涨岁,表示需要轉換的字符拐袜,第二個參數(shù)也是字符串表示轉換的目標。 |
24 | max(str) | 返回字符串 str 中最大的字母梢薪。 |
25 | min(str) | 返回字符串 str 中最小的字母蹬铺。 |
26 | replace(old, new [, max]) | 把 將字符串中的 str1 替換成 str2,如果 max 指定,則替換不超過 max 次秉撇。 |
27 | rfind(str, beg=0,end=len(string)) | 類似于 find()函數(shù)甜攀,不過是從右邊開始查找. |
28 | rindex( str, beg=0, end=len(string)) | 類似于 index()秋泄,不過是從右邊開始. |
29 | rjust(width,[, fillchar]) | 返回一個原字符串右對齊,并使用fillchar(默認空格)填充至長度 width 的新字符串 |
30 | rstrip() | 刪除字符串字符串末尾的空格. |
31 | split(str="", num=string.count(str)) | num=string.count(str)) 以 str 為分隔符截取字符串,如果 num 有指定值赴邻,則僅截取 num 個子字符串 |
32 | splitlines([keepends]) | 按照行('\r', '\r\n', \n')分隔印衔,返回一個包含各行作為元素的列表,如果參數(shù) keepends 為 False姥敛,不包含換行符奸焙,如果為 True,則保留換行符彤敛。 |
33 | startswith(str, beg=0,end=len(string)) | 檢查字符串是否是以 obj 開頭与帆,是則返回 True,否則返回 False墨榄。如果beg 和 end 指定值玄糟,則在指定范圍內(nèi)檢查。 |
34 | strip([chars]) | 在字符串上執(zhí)行 lstrip()和 rstrip() |
35 | swapcase() | 將字符串中大寫轉換為小寫袄秩,小寫轉換為大寫 |
36 | title() | 返回"標題化"的字符串,就是說所有單詞都是以大寫開始阵翎,其余字母均為小寫(見 istitle()) |
37 | translate(table, deletechars="") | 根據(jù) str 給出的表(包含 256 個字符)轉換 string 的字符, 要過濾掉的字符放到 deletechars 參數(shù)中 |
38 | upper() | 轉換字符串中的小寫字母為大寫 |
39 | zfill (width) | 返回長度為 width 的字符串,原字符串右對齊之剧,前面填充0 |
40 | isdecimal() | 檢查字符串是否只包含十進制字符郭卫,如果是返回 true,否則返回 false背稼。 |