编程入门13:Python文本处理

96
starglow_leo
0.1 2018.06.19 13:31* 字数 1081

上一篇:编程入门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模式匹配

编程原来是这样
编程原来是这样
3.2万字 · 3.3万阅读 · 215人关注
对新手最友好的编程入门教学
Web note ad 1