一、存储
.文本
。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的loads()方法,将字符串形式的文本转换为对象。读取对象时,程序中必须已经定义过类。对于Python的内置类(eg:list,dic,string),就不需要再在程序中定义了。但是对于用户自定义的类,就必须要先定义类,然后才能从文件中载入该类的对象。下面是一个例子
二 一寸光阴
.time包
。挂钟时间(Wall Clock Time):是从某个固定时间起点到现在的时间间隔。
。此外,计算机还可以测量CPU实际运行的实际,即处理器实际(Processor Clock Time),以测量计算机性能。当CPU处于闲置状态时,处理器会暂停
使用time包:
借助模块time来测量程序运行时间,比如:
方法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
.日期格式
字符串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/