《零基础学Python》--第4章 Python标准库

196 阅读8分钟

1. 文字处理的 re

A.re相关方法(正则表达式对象Pattern相关方法)

  • 字符串前面加 r 表示去掉 \ (反斜杆)的转义机制
  • 字符串前面加 u 表示以Unicode 格式 进行编码
  • 字符串前面加 b 表示后面的字符串是bytes类型
  • comiple(),传入参数表示要匹配的字符串
  • match(),如果字符串开始位置能够找到这个正则样式的任意个匹配,就返回一个相应的匹配对象。
  • group(),取出匹配后的分组,分组可以通过小括号实现,传入参数int,表示第几组,如果不传参,表示取出所有的部分
  • groups(),取出所有的组合
import re

p = re.compile(r'(\d+)-(\d+)-(\d+)') 
print(p.match('2018-05-10'))
print(p.match('20180510'))
print(p.match('2018-05-10').group())
print(p.match('2018-05-10').group(1))
print(p.match('2018-05-10').groups())

"""
输出结果
<_sre.SRE_Match object; span=(0, 10), match='2018-05-10'>
None
2018-05-10
2018
('2018', '05', '10')
"""
  • search()扫描整个字符串寻找第一个匹配的位置,如果有匹配返回一个相应的匹配对象。
import re

p = re.compile(r'(\d+)-(\d+)-(\d+)') 
print(p.match('aa2018-05-10bb'))
print(p.match('2018-05-10bb'))
print(re.match(r'(\d+)-(\d+)-(\d+)', '2018-05-10bb'))
print(p.search('aa2018-05-10bb'))
print(re.search(r'(\d+)-(\d+)-(\d+)', 'aa2018-05-10bb'))

"""
输出结果
None
<_sre.SRE_Match object; span=(0, 10), match='2018-05-10'>
<_sre.SRE_Match object; span=(0, 10), match='2018-05-10'>
<_sre.SRE_Match object; span=(2, 12), match='2018-05-10'>
<_sre.SRE_Match object; span=(2, 12), match='2018-05-10'>
"""
  • sub()将字符串中符合正则表达式的全部替换
from re import sub

phone = '123-456-789 # 这是电话号码'
p2 = sub(r'#.*$', '', phone)
print(p2)
p3 = sub(r'\D', '', phone)
print(p3)
p4 = sub(r'\d', '', phone)
print(p4)

"""
输出结果
123-456-789 
123456789
-- # 这是电话号码
"""
  • findall() 对字符串返回一个不重复的符合正则的匹配列表,字符串从左到右进行扫描,匹配按找到的顺序返回
import re

p = re.compile(r'(\d+)-(\d+)-(\d+)')
print(re.findall(r'(\d+)-(\d+)-(\d+)', 'a2018-05-10b2018-05-10c2018-05-10d'))
print(p.findall('a2018-05-10b2018-05-10c2018-05-10d'))
"""
输出结果
[('2018', '05', '10'), ('2018', '05', '10'), ('2018', '05', '10')]
[('2018', '05', '10'), ('2018', '05', '10'), ('2018', '05', '10')]
"""

B.常用元字符

  1. '.'在默认模式,匹配除了换行的任意字符。如果指定了标签DOTALL ,它将匹配包括换行符的任意字符
  2. '^'匹配字符串的开头,并且在MULTILINE 模式也匹配换行后的首个符号
  3. '$'匹配字符串尾或者换行符的前一个字符,在MULTILINE 模式匹配换行符的前一个字符
  4. '*'对它前面的正则式匹配0到任意次重复,尽量多的匹配字符串
  5. '+'对它前面的正则式匹配 1 到任意次重复
  6. '?'对它前面的正则式匹配 0 到 1 次重复。
    在修饰符之后添加?将使样式以非贪婪方式或者最小方式进行匹配;尽量少的字符将会被匹配
  7. '{m}'对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败
  8. '{m,n}'对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多
  9. '[]'用于表示一个字符集合。在一个集合中:
    • 字符可以单独列出,比如 [amk] 匹配 'a','m',或者 'k'
    • 可以表示字符范围,通过用 '-' 将两个字符连起来。比如 [a-z] 将匹配任何小写 ASCII 字 符,[0-5][0-9] 将匹配从 00 到 59 的两位数字,[0-9A-Fa-f] 将匹配任何十六进制数位。 如果 - 进行了转义(比如 [a-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就 只表示普通字符 '-'
    • 特殊字符在集合中,失去它的特殊含义。比如 [(+)] 只会匹配这几个文法字符 '(', '+', '', or ')'
    • 字符类如 \w 或者 \S (如下定义) 在集合内可以接受,它们可以匹配的字符由ASCII 或 者LOCALE 模式决定
    • 不在集合范围内的字符可以通过 取反来进行匹配。如果集合首字符是 '^' ,所有 不在集合 内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 '5',[^^] 将匹配所有字符,除了 '^'. ^ 如果不在集合首位,就没有特殊含义
    • 在集合内要匹配一个字符 ']',有两种方法,要么就在它之前加上反斜杠,要么就把它放到 集合首位。比如,[()[]{}] 和 [{}] 都可以匹配括号
  10. '|'A|B,A 和 B 可以是任意正则表达式,创建一个正则表达式,匹配 A 或者 B. 任意个正则表达式可以用 '|' 连接
  11. '\d'匹配数字,等同于[0-9]
  12. '\D'匹配非数字
  13. '\s'匹配一个字符串,只包括a-z
  14. '()'表匹配括号内的任意正则表达式,并标识出组合的开始和结尾

2. 日期类型的time、datetime

A.time一般用于日期和时间的查看

  • epoch是时间开始的点,并且取决于平台,一般是1970年1月1日00:00:00

  • UTC 是协调世界时(以前称为格林威治标准时间,或 GMT)

  • DST 是夏令时,在一年中的一部分时间(通常)调整时区一小时

  • time()返回浮点数从epoch到当前时间的秒

  • gmtime()从epoch到当前的时间转换为UTC的struct_time

  • localtime()从epoch到当前的时间转换为UTC的struct_time

  • time.struct_time返回的时间值序列的类型为gmtime()、localtime()和strptime()。它是一个带有named tuple 接口的对象:可以通过索引和属性名访问值。存在以下值:

    索引 属性
    0 tm_year (例如,1993)
    1 tm_mon range [1, 12]
    2 tm_mday range [1, 31]
    3 tm_hour range [0, 23]
    4 tm_min (range [0, 59]
    5 tm_sec range [0, 61]
    6 tm_wday range [0, 6] ,周一为 0
    7 tm_yday range [1, 366]
    8 tm_isdst 0, 1 或 -1
    N/A tm_zone 时区名称的缩写
    N/A tm_gmtoff 以秒为单位的 UTC 以东偏离
  • strftime(format[, t ])转换一个元组或struct_time表示的由gmtime()或localtime()返回的时间到由format参数指定的字符串。如果未提供t,则使用由localtime()返回的当前时间。format必须是一个字符串。如果t中的任何字段超出允许范围,则引发ValueError。

    指令 意义
    %Y 十进制数表示的带世纪的年份。
    %y 十进制数 [00,99] 表示的没有世纪的年份。
    %m 十进制数 [01,12] 表示的月。
    %d 十进制数 [01,31] 表示的月中日。
    %H 十进制数 [00,23] 表示的小时(24 小时制)。
    %M 十进制数 [00,59] 表示的分钟。
    %S 十进制数 [00,61] 表示的秒。
    %w 十进制数 [0(星期日),6] 表示的周中日。
    %c 本地化的适当日期和时间表示。
    %W 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第 0 周。
    %% 字符%
import time

print(time.time())
print(time.gmtime())
print(time.localtime())
print(time.strftime('%Y-%m-%d %H:%M:%S'))
print(time.strftime('%c'))
"""
输出结果
1577195541.8666182
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=24, tm_hour=13, tm_min=52, tm_sec=21, tm_wday=1, tm_yday=358, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=24, tm_hour=21, tm_min=52, tm_sec=21, tm_wday=1, tm_yday=358, tm_isdst=0)
2019-12-24 21:52:21
Tue Dec 24 21:52:21 2019
"""

B.datetime一般用于日期和时间的修改

  • datetime.date 年月日
  • datetime.time 时分秒微秒
  • datetime.datetime 年月日 时分秒微秒
  • datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
import datetime

print(datetime.datetime.now())
new_time = datetime.timedelta(minutes=10)
print(datetime.datetime.now() + new_time)
one_day = datetime.datetime(2016, 4, 26)
new_date = datetime.timedelta(days=-2)
print(one_day + new_date)
"""
输出结果
2019-12-24 22:12:45.037225
2019-12-24 22:22:45.037280
2016-04-24 00:00:00
"""

3. 数字和数学类型的math、random

A.math数学相关的库

用于机器学习以及深度学习当中,比如计算正弦值等

B.random生成伪随机数

  • random.random()返回 [0.0, 1.0) 范围内的下一个随机浮点数
  • random.randint(a, b)返回随机整数N满足a <= N <= b。相当于randrange(a, b+1)。
  • random.choice(seq)从非空序列 seq 返回一个随机元素。如果 seq 为空,则引发IndexError。
import random

print(random.random())
print(random.randint(1, 5))
print(random.choice(['aa', 'bb', 'cc']))
"""
输出结果
0.05640301910553813
2
bb
"""

4. 文件和目录访问的pathlib、os.path

A.Linux和MacOS下常用的文件操作命令

  • ls 查看文件夹里面内容
  • ls -l 显示文件夹里面内容包括详情,第一个字符是-表示是文件,第一个字符是d表示是文件夹
  • pwd 显示当前文件夹的绝对路径
  • cd+文件夹绝对路径 进入对应的文件夹
  • cd+相对路径 进入当前路径对应的目录文件夹中
  • cd .. 返回上级目录
  • mkdir+绝对路径(相对路径) 新建对应的文件夹,如果中间目录不存在可以通过mkdir -p 绝对路径(相对路径)创建
  • rmdir+路径 删除文件夹,如果文件下还有文件需要使用rm -rf 路径删除
  • cp 路径A 路径B :把路径A拷贝到路径B中
  • mv 文件名 新文件名:给文件重新命名
  • mv 文件名 目录名:将文件移动到目标目录
  • mv 目录名 目录名:目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名

B.os.path库

  • os.path.abspath() 传入路径,会返回文件对应的绝对路径
  • os.path.exists() 传入路径,如果文件存在返回True,不存在就返回False
  • os.path.isdir() 传入路径,判断是否是目录
  • os.path.join() 传入多个路径,可以拼接在一起
import os

print(os.path.abspath('..'))	#一个点表示当前文件的绝对路径,两个点表示上级目录的绝对路径
print(os.path.exists('/Users'))
print(os.path.isdir('/Users'))
print(os.path.join('/tmp/a/', 'b/c/'))
"""
输出结果
/Users/xumao/Desktop/Python/Project
True
True
/tmp/a/b/c/
"""

C.os.pathlib库

from pathlib import Path

p = Path('..')
print(p.resolve())  # 得到当前相对路径对应的绝对路径
print([x for x in p.iterdir() if x.is_dir()])
print(p.is_dir())
q = Path('/tmp/a/b/c')
Path.mkdir(q, parents=True)	# 新建一个目录,parents设置为True,可以自动创建不存在的上级目录
"""
输出结果
/Users/xumao/Desktop/Python/Project
[PosixPath('../NumPy'), PosixPath('../wisdom1'), PosixPath('../geekbangpython-master')]
True
"""

5. 数据压缩和归档的tarfile

6. 通用操作系统的os、logging、argparse

7. 多线程的 threading、queue

8. Internet数据处理的 base64 、json、urllib

9. 结构化标记处理工具的 html、xml

10. 开发工具的unitest

11. 调试工具的 timeit

12. 软件包发布的venv

13. 运行服务的__main__