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协议能实现文件,特别是超文本文件的传输。在互联网时代,它是应用最广的互联网协议之一。
- 请求request:
- 方法:
- GET方法:用于说明想要服务器执行的操作。
- POST方法:它用于从客户端向服务器提交数据,请求的后面会附加上要提交 的数据。服务器会对POST方法提交的数据进行一定的处理。
- 资源路径。
- 协议版本:HTTP第一个广泛使用的版本是1.0,当前版本为1.1。
- 头信息:Host,说明了想要访问的服务器的地址。
- 回复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