内置模块

.random随机模块

import random --->需要导入

- random.random():获取[0.0,1.0)浮点数0到1.0
- random.randint(a,b):整数[a,b]a到b	整数
- random.uniform(a,b):浮点数[a,b] a到b的浮点
- random.shuffle(x): 把参数指定的数据中的元素混洗。参数必须是一个可变的数据类型
- random:sample(x,k)从x随机里面抽取K个数据,组成列表返回

time时间模块

封装了获取时间戳和字符串形式的时间的一些方法.

import time --->需要导入

time.time()
	时间戳:从时间元年(1970.1.1 00:00:00)到限制的秒数(有些语言为毫秒数)
格式化时间对象(9个字段)(给计算机看的)(不利于阅读,利于传输)

- time.gmtime(时间戳,默认当前时间戳)(GMT时间)
- time.localtime(时间戳,默认当前时间戳) 当地时间
格式化时间对象和时间字符串之间的转换(有些小问题)
- s = time.strftime()
- s = time.strptime()
时间戳与格式化时间对象

- time.mktime()
  - print(time.mktime(time.localtime()))	 格式化时间对象转换为时间戳.
暂停当前程序,睡眠XXX秒

- time.sleep()

datetime(日期,时间模块.)

封装了一些和日期,时间相关的类

import datetime

date类(年月日)

d =datetime.date(1010,10,10)
print(d)
print(d.year)
print(d.month)
print(d.day)
time类(时分秒)
			
t = datetime.time(10,20,20)
print(t)
print(t.hour)
print(t.minute)
print(t.second)
datatime类(年月日时分秒)

datetime.datetime.now()      #获取当前时间
timedelta(一般用于数学计算)
	dt =datetime.datetime(2011,11,11,11,11,11)
	td = datetime.timedelta(days=1)
	print(td)
	dt = dt+td
	print(dt)

+ 时间变化量的计算是否会影响上一级(是否会产生进位)
	+ 会进位.
	+ timedelta 和时间段运行结果 去决于被运行的时间类型保持一致.

OS模块

操作文件

os.rename() ;可以重命名文件也可以重命名文件夹
	os.rename("aaa.txt","ccc")    #导入os模块进行重命名
os.remove() ;可以删除文件,不能删除文件夹(shutil模块可以)
	os.remove("ccc.txt")

操作文件夹

文件夹的创建
    os.mkdir() ;
        os.mkdir("rrr")        #无法创建嵌套文件夹、
        os.makedirs("111/222/333")   #创建嵌套文件夹
获取当前路径
    os.getcwd();
        print(os.getcwd())
进入:相当于Linux的cd
	os.chdir;
	os.chdir("333/111")
	os.chdir("../../")
	print(os.getcwd())
获取目录列表:相当于Linux命令中的ls
        os.listdir();
        print(os.listdir())  #不写参数时候显示当前目录下所有文件
        print(os.listdir("aaa"))  #显示指定目录下的所有文件及文件夹
删除目录:只能删除空目录
    os.rmdir();
        os.rmdir("bbb")
判断一个文件或者一个文件夹是否存在
    os.path.exists
        print(os.path.exists("123.txt"))   #在就返回true,不在返回flase
        print(os.path.exists("aaa"))       # 文件和文件夹都可以判断
判断一个路径是文件还是文件夹
    os.path.isfile
        print(os.path.isfile("aaa"))   #判断是否是文件
        print(os.path.isdir("aaa"))    #判断是否是文件夹
返回最后一个文件/文件夹.若以/\结尾返回none
    os.path.basename()
        print(os.path.basename("F:\PyCharms wenjian\day23"))
切分最后一个路径和前面所有路径
    os.path.split()
        print(os.path.split("F:\PyCharms wenjian\day23"))
        结果为:('F:\\PyCharms wenjian', 'day23')
拼接路径,从第一个绝对路径开始
    os.path.join(path1,path2)  
        print(os.path.join(r"F:\aa\bb","f"))	#结果为F:\aa\bb\f
        print(os.path.join(r"aa",r"F:\aa","bb"))  #结果为F:\aa\bb
返回目录或文件的最后访问时间(时间戳)
    os.path.getatime() 
        print(os.path.getatime("F:\PyCharms wenjian\day23"))
        返回值为:1559303907.7618327   
返回path所指向的文件或者目录的最后修改时间
    os.path.getmtime()
        print(os.path.getmtime("F:\PyCharms wenjian\day23"))
        返回值为:1559302621.9885674 
 返回路径目录或者文件的大小
     os.path.getsize() 
        print(os.path.getsize(r"F:\PyCharms wenjian\day20")) 文件夹大小为o
        print(os.path.getsize(r"F:\PyCharms wenjian\day23\argvpp.py"))
        返回值为:613字节

sys模块

sys.argv  在脚本程序运行时候运行的参数
    res = sys.argv[0]       #脚本名
    res1 = sys.argv[1]      #第一个参数
    res1 = sys.argv[2]      #第二个参数
sys.modules  返回系统已经加载的模块,以字典形式返回
sys.path 解释器寻找模块路径
sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值  ***
sys.version        获取Python解释程序的版本信息

json和pickle

json

javascript object notation --- java脚本兑现标记语言:

一种简单的数据交换格式(将所有数据转换为str模式)(set不行)元组会转换为列表.

- 将数据转换成字符串,用于存储或网络传输
- json.dumps(obj) 写到内存
- json.dump(obj,f) 写到文件
- json.loads(obj) 反解内存
- json.load(f) 从文件反解到内存

- json 文件通常是一次性写,一次性读.
- 使用另一种方式可以多次写,多次读
- 把需要序列化的对象,通过多次序列化的方式.用文件的write方法.把多次序列化后的json字符串写到文件中.

拆分的过程叫序列化过程(serialization)
- 专业:将内存中的数据,转化成字节串.用以保存在文件或网络传输.称为序列化过程

拆分后组合过程叫反序列化过程(deserialization)
- 专业:从文件中,网络中获取的数据,转换成内存中原来的数据类型,称为反序列化过程

pickle与json用法,基本相同。

- 将python中所有的数据类型.转换成字节串.序列化过程
- 将字节串转化成python中数据类型.反序列号过程

json和pickle的区别

- josn
  - 不是所有数据类型都可以序列化
  - 不能多次对同一个文件进行序列化
  - json可以跨语言使用
- pickle 
  - 所有python类型都能序列化,结果是字节
  - 能多次对同一个文件进行序列化
  - pickle不能跨语言

结构化数据和线性数据

结构化数据(互相之间有联系. 可以拆分后组织. )(磁盘与内存,网络之间的传输)

线性数据(磁盘是一个典型的线性数据.数据之间没有引用关系)

collections模块

namedtuple(命名元组)

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1, 2)
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,namedtuple就派上了用场:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

depue(双端队列)

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print(q)
	--->deque(['y', 'a', 'b', 'c', 'x'])

q.pop("x")
q.popleft("y")
print(q)
	--->deque(['a', 'b', 'c'])

orderedDict(有序字典)

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:

from collections import OrderedDict
od=OrderedDict([("a",1),('b',2),('c',3)])
print(od)

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

defaultdict(默认值字典)

li = [11,22,33,44,55,77,88,99,90]
result = {}
for row in li:
    if row > 66:
        if 'key1' not in result:
            result['key1'] = []
        result['key1'].append(row)
    else:
        if 'key2' not in result:
            result['key2'] = []
        result['key2'].append(row)
print(result)
from collections import defaultdict

values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = defaultdict(list)

for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)

counter(计数模块)

Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

c=collections.Counter('asdadasfkasldklas;dkadas')
print(c)		--->  Counter({'a': 7, 's': 5, 'd': 5, 'k': 3, 'l': 2, 'f': 1, ';': 1})
print(c['a'])	--->   7

得到结果可以类似字典取值

hashlie模块

- 用于封装一些用于加密的类(md,sha1 等等)
- 加密的目的:用于判断和验证,而并非解码

特点

- 把一个大的数据切分成不同的小块.分别对不同的块进行加密,再汇总的结果和对大的数据直接加密的结果一样
- 单向加密不可逆
- 原始数据一点小的变化,将导致结果的非常大的差异(雪崩差异)

给一个数据加密的三大步骤

- 获取一个加密对象
- 使用加密对象update,进行加密.update可以调用多次
- 通过hexdigest 获取加密结果.或digest()  字节串方式

用法

- 给一个数据加密
- 验证:用另外一个数据加密结果和第一次加密的结果对比
- 如果结果相同,说明原文相同.如果不同则说明原文不同.
- 不同加密算法:实际上就是加密结果长度不同
- 在创建加密对象时,可以指定参数.称为salt.
import hashlib

md5 = hashlib.md5()
md5.update('123456'.encode('utf-8'))	#加密数据类型必须是bytes类型
print(md5.hexdigest())

# 计算结果如下:
'e10adc3949ba59abbe56e057f20f883e'
加盐:
    ret = hashlib.md5('luyi'.encode('utf-8'))  # luyi就是固定的盐,必须是bytes类型
    ret.update('a'.encode('utf-8'))
    print(ret.hexdigest())
动态加盐:
	username='luyi'
    ret = hashlib.md5(username[::2].encode('utf-8'))  # 针对于每个账户,每个账户的盐都不一样
    ret.update('a'.encode('utf-8'))
    print(ret.hexdigest())

re模块

正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。**

正则

元字符 匹配内容
\w 匹配字母(包含中文)或数字或下划线
\W 匹配非字母(包含中文)或数字或下划线
\s 匹配任意的空白符
\S 匹配任意非空白符
\d 匹配数字
\D p匹配非数字
\A 从字符串开头匹配
\z 匹配字符串的结束,如果是换行,只匹配到换行前的结果
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中的字符的所有字符
* 匹配0个或者多个左边的字符。
+ 匹配一个或者多个左边的字符。
匹配0个或者1个左边的字符,非贪婪方式。
精准匹配n个前面的表达式。
匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或者b。
() 匹配括号内的表达式,也表示一个组

什么是正则表达式

一套规则 匹配的字符串的规则

能做什么

- 检测一个输入的字符串是否合法  (web开发项目 表单验证)
  - 用户输入一个内容的时候,我们要提前做检测,能够提高程序的效率并且减轻服务器的压力.
- 从一个大文件中找到符合规则的内容  (爬虫,日志分析)
  - 能够高效的从一大段文字中快速找到符合规则的内容

正则规则

字符组[] 描述的是一个位置上能出现的所有可能性
一个中括号只表示一个字符位置
- [abc] 匹配a或者b或者c	
- [0-9] 根据ascii 进行范围的比对  
- [a-z] 小写字母
- [A-Z] 大写字母
- [a-zA-Z] 大小写字母

可以描述多个范围.多个[]

在正则表达式中能帮助我们表示匹配内容的符号(叫做元字符,表示能匹配那些内容,一个元字符匹配一个字符位置的内容)

- [\d]匹配一位任意数字(digit)
- [\w] 匹配任意一位数字,字母,下划线(word)
- [\s]匹配任何空格(\n,\t,  )
- [\n] entet 回车
- [\t] 制表符
- [\W]对\w取反
- [\D]对\d取反
- [\S]对\s取反
- [\d\D] [\s\S][\w\W]匹配所有
- . 匹配出了换行之外的所有	
- [^]非字符组
- [^\d]除了所有的数字
- ^ 匹配一个字符串的开始
- $ 匹配一个字符串的结尾
- | 或  a|b  匹配a或者b 中的一个,如果匹配a成功不会和b匹配.如果a,b有重叠部分,总是把长的放在前面
- ()  约束或描述的内容的范围
- \ 取消字符的特殊意义
- \b  匹配单词的边界(不太常用)

量词(约束前一个位置元字符,分)

- {n}表示匹配n次
- {n,} 表示匹配至少n次
- {n,m} 表示至少匹配n次 至多m次
- ?表示匹配0次或1次
- +表示1次或多次
- *表示0次或多次

贪婪匹配

在量词范围允许的情况下,尽量多的匹配
	.*x 匹配任意字符,任意多次数,遇到最后一个x才停下来

非贪婪匹配(惰性)

在量词后加一个? 在量词范围允许的情况下,尽量少的匹配.只要遇到合适立刻停止.
	.*?x 匹配任意字符,任意多次数,但是一旦遇到x就停下来

转义符

- 原本有特殊意义的字符,到了表达他本身的时候,需要转义.
- 有一些有特殊意义的内容,放在字符组中,会取消他的特殊意义.[().*+?] 
- -在字符组中表示范围,如果不希望他表示范围,需要转义或者放在字符组首尾

re和正则的关系

有了re模块就可以再python语言中更好的操作正则表达式

re模块

findall 还是安装完整的正则进行匹配.只是只显示括号里匹配到的内容.
search  还是安装完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过group方法传参数来获取具体组中的内容
import re
ret=re.findall("1(\d)(\d)","123")
print(ret)          #[('2', '3')]

我们要查找的内容并没有一个突出的与众不同的特地,甚至会和不需要的杂乱的数据混合在一起,这时候我们就需要把所有的数据统计出来,然后对这个数据进行筛选.把我们真正需要的数据对应的正则表达式用()圈起来,就可以筛选出真正的数据了

取消分组优先显示

ret=re.findall("1(?:\d)(\d)","123")
print(ret)          #['3']

sh·util模块

将文件内容拷贝到另一个文件中
shutil.copyfileobj(fsrc, fdst[, length])
	shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
拷贝文件
shutil.copyfile(src,dst)
	shutil.copyfile(r"F:\PyCharms wenjian\day23\argvpp.py",r"F:\PyCharms wenjian\day23\argvpp1.py")
拷贝文件和权限(shutil.copy2()为拷贝文件和状态信息)
shutil.copy(src,dst)
	shutil.copy(r"F:\PyCharms wenjian\day23\argvpp.py",r"F:\PyCharms wenjian\day23\argvpp1.py")
递归拷贝文件夹
shutil.copytree()
	shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
递归删除文件
shutil.rmtree()
	shutil.rmtree()
递归的移动文件
shutil.move()
	shutil.move("F:\PyCharms wenjian\day23","F:\PyCharms wenjian\day20")
压缩 解压文件
import zipfile,os


z=zipfile.ZipFile("F:\PyCharms wenjian\day23\laxi.zip","w")  #创建一个新的空压缩包(z可以理解为压缩包的文件句柄)
z.write("argvpp.py")        #   将文件写入压缩包
z.close()       #目测需要关闭操作(和文件句柄相似)


s=zipfile.ZipFile("F:\PyCharms wenjian\day23\laxi.zip","r") #创建一个打开压缩包的s(s可以理解为压缩包的文件句柄)
s.extractall(path=r"F:\PyCharms wenjian\day22")     #将文件解压到指定路径
s.close()   #目测需要关闭操作(和文件句柄相似)
posted @ 2019-10-24 16:00  路一  阅读(122)  评论(0编辑  收藏  举报