編程入門13:Python文本處理

上一篇:編程入門12:Python異常處理

計(jì)算機(jī)經(jīng)常需要對文本進(jìn)行各種操作焰雕,我們知道Python語言表示文本的類型是字符串(str)衷笋,其中可以包含任何字符。系統(tǒng)內(nèi)部以標(biāo)準(zhǔn)的“統(tǒng)一碼”(Unicode)來處理所有字符矩屁,用ord()函數(shù)可以返回一個(gè)字符對應(yīng)的“碼位”辟宗,用chr()函數(shù)則可以返回碼位對應(yīng)的字符爵赵。Unicode碼位的取值范圍是0x0至0x10ffff——這是十六進(jìn)制數(shù),等于十進(jìn)制數(shù)0到1114111泊脐,例如最近加入U(xiǎn)nicode字符集的“顏文字”(Emoji)位于0x1f300~0x1f6ff區(qū)域空幻。

In [1]: ord("A")
Out[1]: 65

In [2]: chr(65)
Out[2]: 'A'

In [3]: ord("一")
Out[3]: 19968

In [4]: chr(19968)
Out[4]: '一'

In [5]: for i in range(0x1f600, 0x1f650):  # 基本表情類顏文字
   ...:     print(chr(i), end="")
   ...:     if i % 16 == 15:
   ...:         print()
   ...:         
????????????????????????????????
????????????????????????????????
????????????????????????????????
????????????????????????????????
????????????????????????????????

你還可以在字符串中使用反斜杠打頭的“轉(zhuǎn)義序列”(Escape Sequence)來表示字符,例如反斜杠加n表示換行符容客,而反斜杠加手動(dòng)換行則會(huì)被解釋器完全忽略秕铛。以下是常用的轉(zhuǎn)義序列:

  • \換行:忽略
  • \\:反斜杠(\)
  • \':單引號(')
  • \":雙引號(")
  • \a:響鈴(BEL)
  • \n:換行(LF)
  • \r:回車(CR)
  • \t:水平制表符(TAB)
  • \xhh:十六進(jìn)制數(shù)hh碼位的字符,即擴(kuò)展西文字符(ASCII)
  • \uhhhh:十六進(jìn)制數(shù)hhhh碼位的字符缩挑,即基本多語言位面字符(BMP)
  • \Uhhhhhhhh:十六進(jìn)制數(shù)hhhhhhhh碼位的字符但两,即任何字符

以下是在交互模式下演示這些轉(zhuǎn)義序列:

In [6]: print("人人為我\
   ...: 我為人人")
人人為我我為人人

In [7]: print("人人為我\n我為人人")
人人為我
我為人人

In [8]: print("C:\\Windows\\System32")  # Windows路徑中的\需要轉(zhuǎn)義
C:\Windows\System32

In [9]: r"C:\Windows\System32"  # 加r前綴表示“原始字符串”,解釋器會(huì)自動(dòng)轉(zhuǎn)義
Out[9]: 'C:\\Windows\\System32'

In [10]: print("\x07\u4e00\U0001f600")  # 響鈴供置,漢字一镜遣,顏文字笑臉
一??

實(shí)際上反斜杠加手動(dòng)換行也可以在字符串之外使用,當(dāng)某條語句長度超過80字符時(shí)士袄,你可以用這個(gè)方法來分行悲关,以使代碼格式符合PEP8規(guī)范,更為易讀娄柳。

計(jì)算機(jī)在保存和傳輸數(shù)據(jù)時(shí)都是以8個(gè)二進(jìn)制位組成的“字節(jié)”作為基本單位的寓辱,對于文本來說就需要規(guī)定某種字符“編碼”(Encoding),通過只有256個(gè)碼位的字節(jié)序列來表示任何字符赤拒。Python語言的字節(jié)序列類型是加b前綴表示的“字節(jié)串”(bytes)秫筏,其中的元素顯示為基本西文字符或\xhh轉(zhuǎn)義序列。用str.encode()方法可以將str編碼為bytes挎挖,用bytes.decode()方法可以將bytes解碼為str这敬。Python默認(rèn)使用“8位通用轉(zhuǎn)換格式”(UTF-8)進(jìn)行文本編碼和解碼,中文常用的字符編碼格式還有“國標(biāo)碼擴(kuò)展”(GBK)等:

In [11]: "ABC一二三".encode()  # 使用默認(rèn)的UTF-8編碼
Out[11]: b'ABC\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89'

In [12]: "ABC一二三".encode("gbk")  # 使用GBK編碼
Out[12]: b'ABC\xd2\xbb\xb6\xfe\xc8\xfd'

In [13]: b'ABC\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89'.decode()  # 使用默認(rèn)的UTF-8解碼
Out[13]: 'ABC一二三'

In [14]: b'ABC\xd2\xbb\xb6\xfe\xc8\xfd'.decode("gbk")  # 使用GBK解碼
Out[14]: 'ABC一二三'

In [15]: len(b'ABC\xd2\xbb\xb6\xfe\xc8\xfd')  # 查看字節(jié)串的長度
Out[15]: 9

通過查看字節(jié)串的長度蕉朵,可以看到對于每個(gè)漢字UTF-8使用三字節(jié)編碼崔涂,GBK則使用兩字節(jié)編碼。如果編碼和解碼使用的格式不匹配始衅,就會(huì)出現(xiàn)“亂碼”——請?jiān)L問以下鏈接查看完整的字符編碼列表:https://docs.python.org/3/library/codecs.html#standard-encodings

在不同系統(tǒng)之間傳遞數(shù)據(jù)時(shí)冷蚂,需要先把數(shù)據(jù)對象轉(zhuǎn)化為通用格式再恢復(fù)回來,這個(gè)過程稱為“序列化”(Serialize)和“反序列化”(Unserialize)汛闸。JSON(JavaScript Object Notation)就是一種基于文本的通用數(shù)據(jù)交換格式蝙茶,在互聯(lián)網(wǎng)上應(yīng)用非常廣泛。要在Python中處理JSON诸老,可以引入標(biāo)準(zhǔn)庫的json模塊隆夯。其中dumps()函數(shù)將Python對象序列化為JSON字符串,loads()函數(shù)將JSON字符串反序列化為Python對象:

In [16]: import json

In [17]: dictdata = {"baidu": "百度", "alibaba": "阿里巴巴", "tencent": "騰訊"}

In [18]: jsondata = json.dumps(dictdata, ensure_ascii=False)  # ensure_ascii參數(shù)指定非ASCII字符是否要轉(zhuǎn)義

In [19]: jsondata
Out[19]: '{"baidu": "百度", "alibaba": "阿里巴巴", "tencent": "騰訊"}'

In [20]: json.loads(jsondata)
Out[20]: {'baidu': '百度', 'alibaba': '阿里巴巴', 'tencent': '騰訊'}

以下實(shí)例演示了“微歷”天氣API的使用——加參數(shù)訪問網(wǎng)址返回GZIP壓縮的JSON字節(jié)串,經(jīng)過解壓縮蹄衷、解碼和反序列化得到字典對象苞尝,即可輸出其中的天氣預(yù)報(bào)信息:

"""weather.py 獲取天氣預(yù)報(bào)信息
"""
from urllib.request import urlopen
from urllib.parse import quote
import gzip
import json
url = "http://wthrcdn.etouch.cn/weather_mini?city="
city = "拉薩"


def main():
    try:
        # 發(fā)起網(wǎng)絡(luò)請求獲取數(shù)據(jù)
        data = urlopen(url + quote(city)).read()
        # 解壓縮并解碼得到JSON格式字符串
        data_json = gzip.decompress(data).decode()
        # 反序列化為字典對象
        data_dict = json.loads(data_json)
        if data_dict.get("desc") != "OK":
            print("無法獲取天氣數(shù)據(jù)!")
        else:  # 輸出日期宦芦、天氣、氣溫信息
            print("天氣預(yù)報(bào):" + city)
            forecast = data_dict.get("data").get("forecast")
            for i in forecast:
                date = i.get("date")
                high = i.get("high")
                low = i.get("low")
                weather = i.get("type")
                print("{} {} {} ~ {}".format(date, weather, low, high))
    except Exception as ex:
        print(repr(ex))


if __name__ == "__main__":
    main()

——編程原來是這樣……

編程小提示:QPython3

如果你想在便攜設(shè)備上使用Python轴脐,可以安裝QPython3這個(gè)App(注意是QPython3调卑,另有一個(gè)QPython是基于Python2的),就能隨時(shí)練習(xí)Python編程了(但不支持tkinter圖形界面工具包)大咱。更多詳情可訪問官方網(wǎng)站 http://www.qpython.org/

13_qpython3.jpg

下一篇:編程入門13:Python模式匹配

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恬涧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碴巾,更是在濱河造成了極大的恐慌溯捆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厦瓢,死亡現(xiàn)場離奇詭異提揍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)煮仇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門劳跃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浙垫,你說我怎么就攤上這事刨仑。” “怎么了夹姥?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵杉武,是天一觀的道長。 經(jīng)常有香客問我辙售,道長轻抱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任旦部,我火速辦了婚禮十拣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘志鹃。我一直安慰自己夭问,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布曹铃。 她就那樣靜靜地躺著缰趋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秘血,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天味抖,我揣著相機(jī)與錄音,去河邊找鬼灰粮。 笑死仔涩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粘舟。 我是一名探鬼主播熔脂,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柑肴!你這毒婦竟也來了霞揉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晰骑,失蹤者是張志新(化名)和其女友劉穎适秩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硕舆,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秽荞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抚官。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚂会。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耗式,靈堂內(nèi)的尸體忽然破棺而出胁住,到底是詐尸還是另有隱情,我是刑警寧澤刊咳,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布彪见,位于F島的核電站脂新,受9級特大地震影響肃廓,放射性物質(zhì)發(fā)生泄漏琼开。R本人自食惡果不足惜桂塞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锌历。 院中可真熱鬧希坚,春花似錦殴穴、人聲如沸柴钻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴届。三九已至靠粪,卻和暖如春蜡吧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背占键。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工昔善, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畔乙。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓君仆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牲距。 傳聞我的和親對象是個(gè)殘疾皇子返咱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 最先接觸編程的知識是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識上沐,c語言皮服,java語言,單片機(jī)的匯編語言等参咙;大學(xué)畢...
    oceanfive閱讀 3,087評論 0 7
  • 〇龄广、前言 本文共108張圖,流量黨請慎重蕴侧! 歷時(shí)1個(gè)半月择同,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細(xì)梳理了一遍。 ...
    Raxxie閱讀 18,959評論 17 410
  • 菜鳥 學(xué)習(xí)筆記 # /Users/xxxxx/Desktop/HelloPythion.py # -*- codi...
    weiwei_js閱讀 832評論 0 1
  • 字符是用戶可以讀寫的最小單位。計(jì)算機(jī)所能支持的字符組成的集合择葡,就叫做字符集紧武。字符集通常以二維表的形式存在。二維表的...
    劉惜有閱讀 8,117評論 2 14
  • 三敏储、想談戀愛 來日本幾年了阻星,愛過,給了藍(lán)一年美好的回憶已添,離去妥箕,又給了藍(lán)無邊的寂寞,男人說走就走更舞,從不回頭∑璐保現(xiàn)在,藍(lán)...
    易寫發(fā)閱讀 487評論 0 1