第五章 对象带你飞

一、存储

.文本

。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/

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

推荐阅读更多精彩内容

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