编程入门13:Python文本处理

上一篇:编程入门12:Python异常处理

计算机经常需要对文本进行各种操作,我们知道Python语言表示文本的类型是字符串(str),其中可以包含任何字符。系统内部以标准的“统一码”(Unicode)来处理所有字符,用ord()函数可以返回一个字符对应的“码位”,用chr()函数则可以返回码位对应的字符。Unicode码位的取值范围是0x0至0x10ffff——这是十六进制数,等于十进制数0到1114111,例如最近加入Unicode字符集的“颜文字”(Emoji)位于0x1f300~0x1f6ff区域。

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()
   ...:         
😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏
😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟
😠😡😢😣😤😥😦😧😨😩😪😫😬😭😮😯
😰😱😲😳😴😵😶😷😸😹😺😻😼😽😾😿
🙀🙁🙂🙃🙄🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏

你还可以在字符串中使用反斜杠打头的“转义序列”(Escape Sequence)来表示字符,例如反斜杠加n表示换行符,而反斜杠加手动换行则会被解释器完全忽略。以下是常用的转义序列:

  • \换行:忽略
  • \\:反斜杠(\)
  • \':单引号(')
  • \":双引号(")
  • \a:响铃(BEL)
  • \n:换行(LF)
  • \r:回车(CR)
  • \t:水平制表符(TAB)
  • \xhh:十六进制数hh码位的字符,即扩展西文字符(ASCII)
  • \uhhhh:十六进制数hhhh码位的字符,即基本多语言位面字符(BMP)
  • \Uhhhhhhhh:十六进制数hhhhhhhh码位的字符,即任何字符

以下是在交互模式下演示这些转义序列:

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

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

In [8]: print("C:\\Windows\\System32")  # Windows路径中的\需要转义
C:\Windows\System32

In [9]: r"C:\Windows\System32"  # 加r前缀表示“原始字符串”,解释器会自动转义
Out[9]: 'C:\\Windows\\System32'

In [10]: print("\x07\u4e00\U0001f600")  # 响铃,汉字一,颜文字笑脸
一😀

实际上反斜杠加手动换行也可以在字符串之外使用,当某条语句长度超过80字符时,你可以用这个方法来分行,以使代码格式符合PEP8规范,更为易读。

计算机在保存和传输数据时都是以8个二进制位组成的“字节”作为基本单位的,对于文本来说就需要规定某种字符“编码”(Encoding),通过只有256个码位的字节序列来表示任何字符。Python语言的字节序列类型是加b前缀表示的“字节串”(bytes),其中的元素显示为基本西文字符或\xhh转义序列。用str.encode()方法可以将str编码为bytes,用bytes.decode()方法可以将bytes解码为str。Python默认使用“8位通用转换格式”(UTF-8)进行文本编码和解码,中文常用的字符编码格式还有“国标码扩展”(GBK)等:

In [11]: "ABC一二三".encode()  # 使用默认的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()  # 使用默认的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')  # 查看字节串的长度
Out[15]: 9

通过查看字节串的长度,可以看到对于每个汉字UTF-8使用三字节编码,GBK则使用两字节编码。如果编码和解码使用的格式不匹配,就会出现“乱码”——请访问以下链接查看完整的字符编码列表:https://docs.python.org/3/library/codecs.html#standard-encodings

在不同系统之间传递数据时,需要先把数据对象转化为通用格式再恢复回来,这个过程称为“序列化”(Serialize)和“反序列化”(Unserialize)。JSON(JavaScript Object Notation)就是一种基于文本的通用数据交换格式,在互联网上应用非常广泛。要在Python中处理JSON,可以引入标准库的json模块。其中dumps()函数将Python对象序列化为JSON字符串,loads()函数将JSON字符串反序列化为Python对象:

In [16]: import json

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

In [18]: jsondata = json.dumps(dictdata, ensure_ascii=False)  # ensure_ascii参数指定非ASCII字符是否要转义

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

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

以下实例演示了“微历”天气API的使用——加参数访问网址返回GZIP压缩的JSON字节串,经过解压缩、解码和反序列化得到字典对象,即可输出其中的天气预报信息:

"""weather.py 获取天气预报信息
"""
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:
        # 发起网络请求获取数据
        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("无法获取天气数据!")
        else:  # 输出日期、天气、气温信息
            print("天气预报:" + 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

如果你想在便携设备上使用Python,可以安装QPython3这个App(注意是QPython3,另有一个QPython是基于Python2的),就能随时练习Python编程了(但不支持tkinter图形界面工具包)。更多详情可访问官方网站 http://www.qpython.org/

13_qpython3.jpg

下一篇:编程入门13:Python模式匹配

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 2,954评论 0 7
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,761评论 17 410
  • 菜鸟 学习笔记 # /Users/xxxxx/Desktop/HelloPythion.py # -*- codi...
    weiwei_js阅读 766评论 0 1
  • 字符是用户可以读写的最小单位。计算机所能支持的字符组成的集合,就叫做字符集。字符集通常以二维表的形式存在。二维表的...
    刘惜有阅读 7,892评论 2 14
  • 三、想谈恋爱 来日本几年了,爱过,给了蓝一年美好的回忆,离去,又给了蓝无边的寂寞,男人说走就走,从不回头。现在,蓝...
    易写发阅读 433评论 0 1