第五章 对象带你飞

一、存储

.文本

。Python中的数据都保存在内存中,内存中的数据就会消失。而且,如果Python程序运行结束,那么分配给这个程序的内存空间也会清空。为了长期储存,Python必须包数据存储在磁盘中。磁盘以文件为单位来存储数据,对于计算机来说,数据的本质就是有序的二进制数序列。如果以字节为单位,也就是每8位二进制序列为单位,那么这个数据序列就称为文本。这是因为8位的二进制数序列正好对应ASCII编码的一个字符,而Python就借助文本对象来读写文件

    在Python中,我们通过内置函数open来创建文件对象,在调用open时,需要说明文件名,以及打开文件的方式,即:

f = open(文件名, 方式)

    文件名是文件存在于磁盘的名字,打开文件的常用方式有:

“r"    读取已经存在的文件   eg:f = open("test.txt","r")

”w"    新建文件,并写入

"a"     如果文件存在,那么写入到文件的结尾。如果文件不存在,则新建文件并写入

     读取文件的几种方式

content = f.read(10)   #读取10个字节的数据

content = f.readline()  #读取一行

content = f.readlines()  #读取所有行,储存在列表中,每个元素是一行

      如果以“w"或”a"方式打开,则我们可以写入文本,如:

f = open("test.txt", "w")

f.write("I like apple")

       如果想写入一行,则需要在字符串末尾加上换行符。在UNIX系统中,换行符为“\n"。在Windows系统中,换行符为”\r\n"

f.write("I like apple\r\n")  #Windows

        打开文件会占有计算机资源,因此,在读写完成后,应该及时的用文件对象的close方法观笔文件:  f.close()


.上下文管理器

。文本操作常常和上下文管理器一起使用。上下文管理器(context manager)用于规定某个对象的使用范围。一旦进入或者离开该使用范围,则会有特殊操作被调用,比如为对象分配或者释放内存。对于文件操作来说,我们需要在读写结束时关闭文件。而上下文管理器可以在不需要文件的时候,自动关闭文件。

常规文件操作:


使用上下文管理器:


第二段程序使用了with...as...结构,上下文管理器有隶属于它的程序块,当隶属的程序块执行结束时,就是语句不再缩进时,上下文管理器会自动关闭文件。在程序中,我们调用了f.closed属性来验证是否已经关闭。用上下文管理器的语法时,Python会进入程序块之前调用文件对象的_enter_()方法,在结束程序块的时候调用文件对象的_exit_()方法,而在文件对象的_exit_()方法中,有self.close()语句。因此,在使用上下文管理器时不用明文关闭文件。


我们自定义的_enter_()返回的时self,也就是新建的Vow类对象本身。在_enter_()中,我们为text属性增加了前缀“I say:"。在_exit_()参数中的exc_type,exc_value,traceback用于描述异常。我们可以根据这三个参数进行相应的处理。如果正常运行结束,则这三个参数都是None.

.pickle包

。pickle是腌菜的意思。大航海时代的船员常把蔬菜做出腌菜,装在罐头里带着走。Python中的pickle也有类似的意思。通过pickle包,我们可以把某个对象保存下来,再保存成磁盘里的文件

。对象的存储:分为两步。第一步,我们将对象在内存中的数据直接抓取出来,转换成一个有序的文本,也就是序列化(Serialization).第二步,将文本存入文件


pickle包的dumps()方法可以将对象转换成字符串的形式,然后使用字节文本的存储方法,将该字符串储存在文件

。读取对象

读取对象与存储对象的过程正好相反。首先,先从文件读出文本,然后使用pickle的loads()方法,将字符串形式的文本转换为对象。读取对象时,程序中必须已经定义过类。对于Python的内置类(eg:list,dic,string),就不需要再在程序中定义了。但是对于用户自定义的类,就必须要先定义类,然后才能从文件中载入该类的对象。下面是一个例子


rb 表示以二进制读方式打开,只能读文件

二 一寸光阴

.time包

。挂钟时间(Wall Clock Time):是从某个固定时间起点到现在的时间间隔。

。此外,计算机还可以测量CPU实际运行的实际,即处理器实际(Processor Clock Time),以测量计算机性能。当CPU处于闲置状态时,处理器会暂停

使用time包:


借助模块time来测量程序运行时间,比如:


clock()方法在Windows系统上返回的是挂钟时间,在UNIX系统上返回的是处理器时间,当CPU闲置状态时,处理器时间会暂停

方法sleep()可以让程序休眠


time包还定义了struct_time对象,该对象将挂钟时间转换为年,月,日,时,分,秒等,存储在该对象的鄂格格属性中,比如tm_year,ym_mon等,下面几种方法可以把挂钟时间转换为struct_time对象:

st = time.localtime()  #返回struct_time格式的当地时间

st = time.gmtime()   #获取一个时间数据,返回struct_time格式的UTC时间

s = time.mktime(st)  #执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数。

如果输入的值不是一个合法的时间,将触发 OverflowError 或 ValueError。下面是一个例子


.datetime包

。datetime包是基于time包的一个高级包,它可以理解为由date和time两个部分组成。date是指年,月,日构成的日期,相当于日历。time是指时,分,秒,毫秒构成的一天24小时中的具体时间。datetime有三个类,即datetime.date   datetime.time   datetime.datetime

。此外,我们还可以进行时间间隔的运算,datetime包包含一个专门代表时间间隔对象的类,即timedelta



在给date.time.timedelta传递参数是,出来上面的seconds和weeks外,还可以是days,hourss,milliseconds,microseconds

.日期格式


字符串format定义了一个格式。通过strptime方法,Python会把需要解析的字符串往格式上凑

此外,我们也可以调用datetime对象的strftime方法,将datetime对象转换为特定格式的字符串。

格式化转化的关键是%引领的特殊符号。这些特殊符号有很多,代表不同的时间信息,常见的特殊符号有:

%A 英文的星期几,如Sunday

%a 简写的英文星期几,如Sun

%p 上午/下午

%I   表示小时,12小时制

%f    表示毫秒

但如果想在格式中表达%这个字符本身,而不是特殊符号,那么可以使用%%

三  看起来像那样的东西

。正则表达式(Regular Expression):从字符串(string)中通过特定的模式,搜索希望找到的内容

m = re.search(pattern, string)    #搜索整个字符串,直到发现符合的子字符串

m = re.match(pattern, string)      #从头开始检查字符串是否符合正则表达式

                                                    #必须从字符串 的第一个字符开始就相符

str = re.sub(pattern, replacement, string)   #利用正则pattern在字符串string中进行搜索,对于搜索到的字符串,用另一个字符串replacement进行替换,函数将返回替换后的字符串

此外常用的方法还有:

re.findall() 查找字符

从字符串中找出所有符合模式的字符序列:findall(模式(正则表达式),目标字符串), 返回值为list类型,list元素为匹配出的各个字符串

re.split(pattern, string, maxsplit=0)

通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。

例如:

re.split('\W+', 'aaa;, aaa, aaa.')

['aaa', 'aaa', 'aaa', '']

re.split('(\W+)', 'aaa;, aaa, aaa.')

['aaa', ';, ', 'aaa', ', ', 'aaa', '.', '']

#pattern也在结果列表里

\w+ 单词字符       \W+ 非单词字符

.写一个正则表达式

。正则表达式的常用语法


。表达重复的用法


。表达位置的方法


.进一步提取

group(number):用来查询群,group(0)是整个正则表达的搜索结果。group(1)是第一个群,以此类推。

我们还可以将群命名,以更好使用group查询


上面的(?P<year>...)括住了群,并把它命名为year,然后就可以通过“year"这个键来提取结果

四 Python有网瘾

。在日常交谈中,我们无形中使用约定俗成的语法。如果两个人使用不同的语法,那么就是以不同的协议来 交流,最终会不知所云,计算机通信也要遵循通信协议。HTTP协议是最常见的一种网络协议,它的全名是 the Hypertext Transfer Protocol,即超文本传输协议。HTTP协议能实现文件,特别是超文本文件的传输。比如:当我们访问一个网址时,通常会在浏览器输入http打头的网址,这个http字样就是要用HTTP协议访问相应网站

。HTTP的工作方式类似于快餐点单

(1)请求(request):比如说顾客点个鸡腿汉堡

(2)回复(response):服务员根据情况来回复顾客的请求,比如:1)服务员把鸡腿汉堡交给顾客,即一切OK   2)服务员发现自己在甜品站,于是让顾客前往正式柜台点单,即重新定向   3)服务员告诉顾客鸡腿汉堡没有了,即无法找到

。计算机按下面的格式发出请求


GET /index.html HTTP/1.1

HOST: www.example.com


上面的GET方法,用于说明想要服务器执行的操作。 /index.html 即资源的路径,这里指向服务器上的index.html文件。 HTTP/1.1 即协议的版本,HTTP第一个广泛使用的版本是1.0,当前版本为1.1。 HOST则说明了想要访问的服务器的地址

。服务器在接收到请求后,会根据程序,生成对应于该请求的回复,比如;


HTTP/1.1 200 OK    #协议版本是HTTP/1.1  状态码:  200     OK

Content-type: text/plain

Content-length:12

Hello World!


状态码(Status  Code)代表了服务器回应的类型,上面的200表示一切OK。其他常见的状态码还有很多,例如:(1)302,重新定向(Redirect):我这里没有你想要的资源,但我知道另一个地方...有,你可以去那找  (2)404,无法找到(Not Found):我找不到你想要的资源,无能为力

Content-type说明了主体所包含的资源的类型,根据类型的不同,客户端可以启动不同的处理程序(如:显示图像,播放声音),下面是常见的一些资源:

text/plain:普通文本

text/html:HTML文本

image/jpeg:jpeg图片

image/gif:gif图片

Content-length说明了主体部分的长度,以字节(byte)为单位

剩下的”Hello World!"是回复的主体部分,包含了主要的文本数据。

.http.client包

。Python标准库中的http.client包可用于发出HTTP请求,HTTP请求最重要的一些信息是主机地址,请求方法和资源路径


import http.client


conn  = http.client.HTTPConnection("www.example.com")  # 主机地址

conn.request("GET", "/")        # 请求方法和资源路径

response = conn.getresponse()  #获得回复


print(response.status, response.read)  #回复的状态码和状态描述

content = response.read()                     #回复的主体内容

print(content)


五 写一个爬虫

代码地址:https://gitee.com/mabingqi/learn_programming_from_python/tree/master/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 5.1 存储 5.1.1 文件 内存存储:当电脑断电时,内存中的数据就会消失。另一方面,如果Python程序运行结...
    SibyLtuI阅读 194评论 0 0
  • 5.1 存储 5.1.1 文件 ①打开 如果Python程序运行结束,那么分配给这个程序的内存空间也会清空。为了长...
    XavieR_ZzQ阅读 141评论 0 0
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,801评论 0 10
  • 原文链接 《Python数据分析》(Python for Data Analysis, 2nd Edition)第...
    李绍俊阅读 8,530评论 0 5
  • 独生子女政策,让我们生来就没有兄弟姐妹争抢玩具和宠爱。素质教育,让我们小学就开始享受撕书的快感。千年虫,让我们的中...
    预言哥阅读 219评论 0 2