第五章 对象带你飞

5.1 存储

5.1.1 文件

内存存储:当电脑断电时,内存中的数据就会消失。另一方面,如果Python程序运行结束,那么分配给这个程序的内存空间也会清空。

磁盘存储:以文件为单位来存储数据,即使断电或程序结束,数据依然存在。

文本:对于计算机来说,数据的本质就是有序的二进制数序列。如果以字节为单位,也就是每8位二进制数序列为单位,那么这个数据序列就称为文本。这是因为,8位的二进制数序列正好对应ASCII编码中的一个字符。 而Python能够借助文本对象来读写文件。

open():创建文件对象。对象名 = open(文件名,方式)。

  • 文件名:文件存在于磁盘的名字。
  • 常用方式:
    • "r":读取已经存在的文件。
    • "w" :新建文件,并写入。
    • "a":如果文件存在,那么写入到文件的结尾。如果文件不存在,则新建文件并写入。

文件的方法

  • 文件名.read([size]):从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,范围为字符串对象。

  • 文件名.rearline():每次读出一行内容,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。

  • 文件名.readlines():读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。

  • 文件名.write(string):将string写入文本。不会在字符串的结尾添加换行符。在UNIX系统中,换行符为"\n"。在Windows系统中,换行符为"\r\n"。

  • 文件名.close():刷新缓冲区里任何还没写入的信息,关闭文件,避免打开的文件端口将占用计算机资源。


5.1.2 上下文管理器

with 表达式 as 变量:
    ...

  • with:对其后的代码求值。该表达式返回一个对象,该对象包含两个特殊方法:__enter__和__exit__。
  • as:__enter__方法返回的结果会赋给as关键字后面的变量。
  • __enter__:不接受除self参数外的任何参数。
  • __exit__:有四个参数,self、exc_type(异常类型)、exc_value(异常实例)、traceback(回溯)。后三个为用于描述异常的位置参数,无异常时它们全为None,但如果在代码块内有异常发生,则参数被填充。

上下文管理器:含有__enter__和__exit__方法的对象就是上下文管理器。Python会在进入程序块之前调用文件对象的__enter__()方法,在结束程序块的时候调用文件对象的__exit__()方法。


5.1.3 pickle包

存储对象

  • pickle.dumps(obj):将对象在内存中的数据直接抓取出来,转换成一个有序的文本,即序列化。
  • write方法:将文本存入文件。
  • pickle.dump(obj, file):将上面两步合并。

读取对象

  • open方法:从文件中读出文本。
  • pickle.loads(file):将字符串形式的文本转换为对象。
  • pickle.load(file):将上面两步合并。
  • 对于用户自定义的类,就必须要先定义类,然后才能从文件中载入该类的对象。


5.2 一寸光阴

5.2.1 time包

挂钟时间:从某个固定时间起点到现在的时间间隔。对于UNIX系统来说,起点时间是1970 年1月1日的0点0分0秒。其他的日期信息都是从挂钟时间计算得到的。

处理器时间:CPU实际运行的时间。以测量计算机性能。当CPU处于闲置状态时,处理器时间会暂停。

struct_time对象:该对象将挂钟时间转换为年、月、日、 时、分、秒等,存储在该对象的各个属性中。

  • tm_year:4位数年。
  • tm_mon:月。1-12。
  • tm_mday:日。1-31。
  • tm_hour:小时。0-23。
  • tm_min:分钟。0-59。
  • tm_sec:秒。0-61(60或61是闰秒)。
  • tm_wday:一周的第几日。0-6(0是周一)。
  • tm_yday:一年的第几日。1-366(儒略历)。
  • tm_isdst:夏令时。-1, 0, 1, -1是决定是否为夏令时的旗帜。

time的方法

  • time.time():返回挂钟时间。

  • time.clock()

    • UNIX:返回处理器时间。
    • Window:返回挂钟时间。
  • time.sleep(t):让程序休眠。根据sleep()接收到的参数,程序会在某时间间隔(t)之后醒来继续运行。

  • time.gmtime([sec]):将挂钟时间转换为struct_time格式的UTC时间,如果sec参数未输入,则以当前时间为转换标准。

  • time.localtime([sec]):将挂钟时间转换为struct_time格式的当地时间,如果sec参数未输入,则以当前时间为转换标准,当地时区根据系统环境决定。

  • time.mktime(t):将struct_time格式转换成挂钟时间。

  • time.ctime([sec]):将一个挂钟时间转化为字符串的形式,默认time.time()为参数。


5.2.2 datetime包

datetime包:基于time包的一个高级包。

  • datetime.date类:基于年、月、日构成的日期的功能。
  • datetime.time类 :基于指时、分、秒、毫秒构成的一天24小时中的具体时间的功能。
  • datetime.datetime类:综合上述两类。

datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]):构造datetime对象。

  • 1 <= year <= 9999
  • 1 <= month <= 12
  • 1 <= day <= 30/31
  • 0 <= hour < 24
  • 0 <= minute < 60
  • 0 <= second < 60
  • 0 <= microsecond < 1000000

datatime.timedelta():时间间隔。传入参数可为上述除year外的所有参数。

运算

  • datetime2 = datetime1 + timedelta
  • datetime2 = datetime1 - timedelta
  • timedelta = datetime1 - datetime2
  • datetime1 < datetime2


5.2.3 日期格式

datetime.strptime(string[, format]):根据指定的格式format把一个时间字符串解析为时间元组。

t.strftime(format): t是一个struct_time对象。接收时间元组,返回以可读字符串表示的当地时间,格式由参数format决定。

format格式

  • %y:两位数的年份表示(00-99)。
  • %Y:四位数的年份表示(000-9999)。
  • %m:月份(01-12)。
  • %d:月内中的一天(0-31)。
  • %H:24小时制小时数(0-23)。
  • %I:12小时制小时数(01-12)。
  • %M:分钟数(00=59)。
  • %S:秒(00-59)。
  • %f:表示毫秒。
  • %a:本地简化星期名称。
  • %A:本地完整星期名称。
  • %b:本地简化的月份名称。
  • %B:本地完整的月份名称。
  • %c:本地相应的日期表示和时间表示。
  • %j:年内的一天(001-366)。
  • %p:本地A.M.或P.M.的等价符。
  • %U:一年中的星期数(00-53)星期天为星期的开始。
  • %w:星期(0-6),星期天为星期的开始。
  • %W:一年中的星期数(00-53)星期一为星期的开始。
  • %x:本地相应的日期表示。
  • %X:本地相应的时间表示。
  • %Z:当前时区的名称。
  • %%:%号本身。


5.3 看起来像那样的东西

5.3.1 正则表达式

正则表达式:描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

re方法

  • re.search(pattern, string, flags=0):扫描整个字符串并返回第一个成功的匹配。

    • pattern:匹配的正则表达式。
    • string:要匹配的字符串。
    • flags:标志位,用于控制正则表达式的匹配方式。
      • re.I:使匹配对大小写不敏感
      • re.L:做本地化识别(locale-aware)匹配
      • re.M:多行匹配,影响 ^ 和 $
      • re.S:使 . 匹配包括换行在内的所有字符
      • re.U:根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
      • re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
  • re.match(pattern, string, flags=0):从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

  • re.sub(pattern, repl, string, count=0, flags=0):替换字符串中的匹配项。

    • pattern : 正则中的模式字符串。
    • repl : 替换的字符串,也可为一个函数。
    • string : 要被查找替换的原始字符串。
    • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • re.split(pattern, string[, maxsplit=0, flags=0]):按照能够匹配的子串将字符串分割后返回列表。

    • attern:匹配的正则表达式。
    • string:要匹配的字符串。
    • maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
    • flags:标志位,用于控制正则表达式的匹配方式。
  • re.findall(string[, pos[, endpos]]):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

    • string : 待匹配的字符串。
    • pos : 可选参数,指定字符串的起始位置,默认为 0。
    • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。


5.3.2 写一个正则表达式

  • ^:匹配字符串的开始位置。(例外:用在中括号中[ ]时,可以理解为取反,表示不匹配括号中字符串。)
  • $:匹配字符串的结束位置。
  • *:匹配零次到多次。
  • +:匹配一次到多次 (至少有一次)。
  • ?:匹配零次或一次。
  • .:匹配单个字符 。
  • |:或者,两项中取一项。
  • ( ):匹配括号中全部字符。
  • [ ]:匹配括号中一个字符,范围描述,如[0-9 a-z A-Z]。
  • { }:大括号用于限定匹配次数。如 {n}表示匹配n个字符,{n,}表示至少匹配n个字符,{n,m}表示至少n,最多m。
  • \:转义字符。如上基本符号匹配都需要转义字符。如 * 表示匹配*号。
  • \s:任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
  • \S:非任何空白字符。
  • \w:英文字母和数字。
  • \W:非字母和数字。
  • \d:数字。
  • \D:非数字。


5.3.3 进一步提取

group:括号()圈起来的正则表达式的一部分。一个正则表达式中可以有多个群。可以使用(?P<name>…)命名。

对象名.group(num = 0):返回一个或多个匹配的字串。如果只有一个参数,结果只有单个字符串;如果有多个参数,结果是一个元组,元组里每一项对应一个参数;没有参数则默认是0,整个匹配串被返回。

对象名.groups():返回一个包含所有小组字符串的元组。


5.4 Python有网瘾

5.4.1 HTTP通信简介

HTTP协议:the Hypertext Transfer Protocol,即超文本传输协议。HTTP协议能实现文件,特别是超文本文件的传输。在互联网时代,它是应用最广的互联网协议之一。

  1. 请求request:
  • 方法:
    • GET方法:用于说明想要服务器执行的操作。
    • POST方法:它用于从客户端向服务器提交数据,请求的后面会附加上要提交 的数据。服务器会对POST方法提交的数据进行一定的处理。
  • 资源路径。
  • 协议版本:HTTP第一个广泛使用的版本是1.0,当前版本为1.1。
  • 头信息:Host,说明了想要访问的服务器的地址。
  1. 回复response:
  • 协议版本。
  • 状态码:由3位数字组成,表示请求是否被理解或被满足。
  • 状态描述: 对原文的状态码作简短的描述。
    • 200:OK。
    • 302:Found。
    • 404:Not Found。
  • Content-type:主体所包含的资源的类型。根据类型的不同,客户端可以启动不同的处理程序。
    • text/plain:普通文本。
    • text/html:HTML文本。
    • image/jpeg:jpeg图片。
    • image/gif:gif图片。
  • Content-length:说明了主体部分的长度,以字节(byte)为单位。
  • 主体部分:包含了主要的文本数据。


5.4.2 http.client包

import http.client
conn     = http.client.HTTPConnection("www.example.com") # 主机地址 
conn.request("GET", "/")                                 # 请求方法和资源路径 
response = conn.getresponse()                            # 获得回复    
print(response.status, response.reason)                  # 回复的状态码和状态描述 
content  = response.read()                               # 回复的主体内容 
print(content)


5.5 写一个爬虫

  • 使用http.client包获取网站信息。
  • 使用正则表达式提取信息。

由于未知的原因,我无法使用http.client包获得Vamei博客的信息,所以使用pip安装了requests包。具体代码可参考码云。

代码地址:https://gitee.com/sibyltui/learn_programming_from_python

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

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,712评论 0 8
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,835评论 6 13
  • 常用模块 认识模块 什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文...
    go以恒阅读 1,930评论 0 6
  • 类 !/usr/bin/python -- coding: UTF-8 -- class Employee:'所有...
    SkTj阅读 938评论 0 0
  • 姓名:李俊秀 公司:宁波大发化纤有限公司 期数:六项精进259期学员 组别:感谢一组 【日精进打卡第67天】 【知...
    花语花香9阅读 160评论 0 0