python中的常用模块

1 collections 模块:

    1 namedtuple    生成可以使用名字来访问元素内容的tuple
2 deque 双端队列,可以快速的从另外一侧追加和推出对象
3 Counter 计数器 主要用来技术
4 OrderedDict 有序字典
5 defaultdict 带有默认值的字典
from collections import namedtuple,deque,OrderedDict,defaultdict,Counter
# #obj=namedtuple(name,list)  list列表中的参数需要和调用该方法的参数位置和数量对等
# point=namedtuple('point',['x','y'])
# p=point(1,2)
# print(p.x)
# print(p.y)
# print(p)

#花色和数字
# card=namedtuple('card',['suits','number'])
# c1=card('红桃',2)
# print(c1)
# print(c1.suits)
# print(c1.number)


#deque  使用list存储数据的时,按索引访问元素很快,
#       但是插入和删除元素就很慢了,因为list是线性存储,
#       数据量大的时候,插入和删除效率就很低
#deque  是为了高效实现插入和删除操作的双向列表,适合与队列和栈
# import queue
# q=queue.Queue()
# q.put(5)
# q.put(6)
# q.put(7)
#
# #qsize 查看队列中的长度是多少
# print(q.qsize())
# print(q.get())
# print(q.get())
# print(q.get())
# # 若队列中已经被取空 则回被阻塞
# print(q.get())  #阻塞

#deque 双端队列  可以从两端存或则取
# q=deque([1,2])
# q.append('a')   #从后边放数据   [1,2,a]
# q.appendleft('b')  #左边放数据  [b,1,2,a]
# print(q.pop())          #从右边删 a
# q.popleft()      # 从左边删 b


#OrderedDict
# d=dict([('a',1),('b',2),('c',3)])
# print(d)   #dict的key是无序的
# od=OrderedDict([('a',1),('b',2),('c',3)]) #orderedDict 中的key是有序的
# print(od)
# print(od['a'])
# for i in od:
#     print(i)


#defaultdict
values=[11,22,33,44,66,77,88]
my_dict=defaultdict(list)  #参数内必须是可调用的数据类型 可传入 list set等
my_dict01=defaultdict(lambda :5)
for value in values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(my_dict,my_dict01)

2 time模块:

  python中的内置时间模块

import time
#sleep  time()
# time.sleep(0.1)
# #时间戳  ------float  给计算机看的
# print(time.time())  #时间戳  从1970.1.1  00:00 开始按秒计算的偏移量,
#
#
# #时间字符串 格式化时间  给人看的
#
# print(time.strftime("%Y-%m-%d %X"))  #x代表本地时间
# print(time.strftime("%Y-%m/%d %H:%M:%S"))
# print(time.strftime("%m/%d %H:%M:%S"))
# print(time.strftime("%H:%M:%S"))
# print(time.strftime("%H:%M"))
#
#
# #结构化时间-----元组   计算用的
# struct_time=time.localtime()
# print(struct_time)
# print(struct_time.tm_year)


#时间戳和结构化时间转换    字符串时间和时间戳之间不能直接转换
# t=time.time()
# print(time.localtime())# 获取本地结构化年时间
# print(time.localtime(t))#将获取的时间戳转换成结构化时间
# print(time.gmtime())# 格林威治时间
# print(time.mktime(time.localtime()))#将本地结构换时间转换成时间戳


#结构化时间和字符传时间转换   字符串时间和时间戳之间不能直接转换

#字符串时间转结构化时间
# print(time.strptime('2019-12-14','%Y-%m-%d'))
# #结构化时间转字符串时间
# print(time.strftime('%m/%d/%Y %H:%M:%S',time.localtime(1600000000)))



# asctime(结构化时间) 如果不传入参数 直接返回当前时间的格式化串
# ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串
print(time.asctime(time.localtime()))
print(time.ctime())

 

3 random模块:

  python中的随机数模块

import random

#随机小数 random返回一个大于0且小于1之间的小数      uniform大于n小于m的小数
# print(random.random())
# print(random.uniform(1,4))
#
#
# #随机整数  randint(1,5)大于等于1且小于等于5之间的整数
# print(random.randint(1,5))
# print(random.randrange(1,10,2))#返回等于1且小于10之间的奇数,2等于是步长
#
#
# #随机选择一个返回
# print(random.choice([1,'23',[4,5]]))
# #随机选择多个返回 返回的个数为函数的第二个参数
# print(random.sample([1,'23',[4,5]],2))


#打乱列表顺序
# item=[1,2,5,7,9]
# random.shuffle(item)
# print(item)

 4 os模块:

  python内置模块,用来和操作系统交互

import os

# #getcwd 返回当前工作目录 即当前python脚本工作的目录路径
# print(os.getcwd())
#chdir 切换目录 和shell中的cd类似
# os.chdir(r'C:\Users\Administrator\PycharmProjects')
# print(os.getcwd())


#返回当前目录(.)
# print(os.curdir)
#获取当前目录的父目录字符串名(..)
# print(os.pardir)
#也可以使用chdir 相当于cd ..  返回父目录
# os.chdir('..')
# print(os.getcwd())

#创建  makedirs 生成多层递归目录 即dirname1是dirname2的父目录
# os.makedirs('dirname1/dirname2')
#删除  removedirs   若目录为空 则删除   并递归到上一级目录 如若也为空 则删除  以此类推
# os.removedirs('dirname1')

# 创建  mkdir  生成单级目录  mkdir dirname
# os.mkdir('dirname3')

# 删除 rmdir    删除单级空目录 若目录不为空则无法删除 报错 rmdir dirname
# os.rmdir('dirname3')

# #列出指定目录下的所有文件和子目录,包括隐藏文件,并且以列表的形式打印出来
# print(os.listdir(r'C:\Users\Administrator\PycharmProjects\day'))
#
# #删除一个文件 remove
# os.remove('dirname3\方法')


#重命名一个文件/目录  该当前目录下的文件或则子目录
# os.rename('oldname','newname')

#获取文件/目录信息
# print(os.getcwd())
# print(os.stat('day19d.py'))
'''
stat 结构:

st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
'''

#获取当前操作系统的目录分隔符 Win \   linux /  python代码跨平台用的
# print(os.sep)
#
# #获取输出当前平台使用的行终止符   Win下位'\t\n'   linux下为‘\n’
# print(123)
# print(os.linesep)
# print(456)


# #输出用于分割文件路径字符串   win---> ;   linux--->:
# print(os.pathsep)
#
# #输出字符串只是当前使用平台 win--->'nt';   linux----->'posix'
# print(os.name)

#运行shell命令 直接显示  linux 是对应shell命令    win是对应dos命令
#system 和 popen区别   前者没有返回值 而后者有
# # print(os.system('dir'))
# ret=os.popen('dir').read()
# print(ret)
#
# #获取环境变量
# print(os.environ)


#os.path
#返回path规范化的绝对路径
# print(os.path.abspath(os.getcwd()))
# #将path分割成目录和文件名元组返回
# print(os.path.split(os.getcwd()))
#
# #返回path的目录,其实就是os.path.split(path)的第一个元素
# print(os.path.dirname(os.getcwd()))
#
# #返回path最后的文件名,如果path以/或\结尾,那么就会返回空值
# #其实就是os.path.split(path)中的第二个值
# print(os.path.basename(os.getcwd()))
#
# #判断路径是否存在  如果path存在则返回True  否则False
# print(os.path.exists(os.getcwd()))

#如果path是绝对路径 返回True
# print(os.path.isabs(os.getcwd()))
#
# #如果path是一个存在的文件,返回True 否则False
# print(os.path.isfile(r'C:/Users/Administrator/PycharmProjects/day/day19/day19d.py'))
#
# #如果path是一个存在的目录 则返回True 否则False
# print(os.path.isdir('C:/Users/Administrator/PycharmProjects/day/day19'))
#
# #将多个路径组合返回  第一个绝对路径之前的参数将被忽略
# print(os.path.join('C:/Users/','Administrator/PycharmProjects/','day'))

#返回path所指向的文件或目录的最后访问时间  返回时间戳
# print(os.path.getatime(os.getcwd()))
# #返回path所指向的文件或目录的最后修改时间   返回时间戳
# print(os.path.getmtime(os.getcwd()))
#
# #返回path的大小  文件夹最大4096
# print(os.path.getsize(os.getcwd()))

  

5 sys模块:

  和python解释器交互的一个接口

#命令行参数list  第一个元素是程序本身路径  执行一个脚本需要先传一些参数

# 1 需要在终端 运行文件时 把参数传入  格式  python 文件名 参数1 参数2
#  2 传入的参数1 参数2需要在文件中已经做了判断 才能用
# 验证权限使用 在命令行执行文件需要权限
ret01=sys.argv
print(ret01)
name=ret01[1]
pwd=ret01[2]
if name=='alex' and pwd=='yuan':
    print('login pass')
else:
    print('login faile')
    sys.exit()
print('可以使用')
#返回操作系统平台名称
# print(sys.platform)
# #退出程序exit(n)    正常退出时exit(0) 错误退出sys.exit(1)
# #整个程序退出  等于退出python解释器,如果exit(1) 则为错误退出发送给系统处理
#
# #获取python的解释器版本
# print(sys.version)
#
#
# #搜索模块的搜索路径 初始化时使用python
# # 顺序 本身所处的目录找----->到上一级搜-------->python解释器中搜索
# print(sys.path)

 

6 序列化模块:

  python 中有三种序列化模块

    1 json   

      通用的序列化格式 只有很少的一部分数据类型通过json转化成字符串

    2 pickle

      所有的python中的数据类型都可以转化成字符串形式,pickle序列化的内容只有python能理解
且反序列化依赖python代码

    3 shelve

      操作简单,生成序列化句柄,使用句柄直接操作,非常方便

 

    json:

import json
#可序列化数据类型 数字 字符串 列表 字典 元组(先转成列表在序列化)
#json  dumps序列化方法 loads反序列化方法   在内存中直接更改
#数据结构中用单引号,序列化后回转成双引号,
# 因为json是个单引号的数据类型,json_str='{"k1":"v1"}'需要将数据类型中的单引号转化才能做区分
# dict_json={'k1':'v1'}
# dict_str=json.dumps(dict_json)
# print(type(dict_str),dict_str)
# dic_d=json.loads(dict_str)
# print(type(dic_d),dic_d)


#dump   load   操作文件  dump先序列化字符串 在写到文件中  load先读出来在反序列化
# dict_json01={'k2':'v2'}
# f=open('fff','w',encoding='utf8')
# json.dump(dict_json01,f)

# f1=open('fff','r',encoding='utf8')
# ret=json.load(f1)
# f1.close()
# print(type(ret),ret)


#dump指定参数ensure_aciis=False  可以写中文 否则直接写成bytes类型 但是不影响读取
# dict_json02={'k2':'v2','k3':'大中国'}
# f=open('fff','w',encoding='utf8')
# json.dump(dict_json02,f,ensure_ascii=False)
# f.close()


# 如果插入的时候将多个数据类型放在一行 则回报错
# 解决思路
# 1 将数据用dumps一个一个的字符串后边+/n就做到了换行 然后在写入文件
# 2 然后在用for循环在一行一行的读出来,然后去空格 在load出来
# 3 这样就避开了dump和load
# f1=open('fff','r',encoding='utf8')
# ret=json.load(f1)
# f1.close()
# print(type(ret),ret)

  

 

    2 pickle

# 方法  dumps dump(序列化,存)  loads(反序列化,读)  load
#pickle不仅可以序列化字典,列表,可以把python中的任意的数据类型序列化
import pickle
#
# dict_pickle={'k1':'v1','k2':'v2','k3':'v3'}
# str_dictp=pickle.dumps(dict_pickle)
# print(str_dictp) #返回的是二进制 所以和json中的dump不同之处就在于返回值类型不同
#
# dict_pickle01=pickle.loads(str_dictp)
# print(dict_pickle01)    #字典
#
# import time
# struct_time=time.localtime(20000000000)
# print(struct_time)
# f=open('pickle_file','wb')
# pickle.dump(struct_time,f)
# f.close()
#
# f1=open('pickle_file','rb')
# struct_time2=pickle.load(f1)
# print(struct_time2.tm_year)

  

 

    3 shelve 只提供一个open方法,用key来访问,类似字典。此模块有限制,不支持多个应用同一时间往同一个DB(实际上就是shelve文件)进行写操作。

'''
shelve  只提供一个open()方法,用key来访问,类似字典
       此模块有限制,不支持多个应用同一时间往同一个DB(实际上就是shelve文件)进行写操作。
       如果应用如果值进行读操作,可以让shelve通过只读方式打开DB
       即使是以读的形式打开,也可以直接可以修改 flag=‘r’执行只读 --->f=shelve.open(filename,flag='r')
       
       由于shelve在默认情况下是不会记录 待持久化对象的任何修改的,
       所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存
'''
import shelve
#存数据
# f1=shelve.open('shelve_file')
# #直接对文件句柄操作,就可以存入
# f1['key']={'int':10,'float':45.21,'str':'yuan'}
# print(dict(f1))
# f1.close()
#
#
# #读取数  取出数据的时候也只需要直接用key获取即可,但是如果key不存在则会报错
# f2=shelve.open('shelve_file')
# ret=f2['key']
# f2.close()
# print(ret)


#即使是以读的形式打开,也可以直接可以修改 flag=‘r’执行只读 --->f=shelve.open(filename,flag='r')
# f=shelve.open('shelve_file01',flag='r')
# f['key']=10
# exising=f['key']
# print(exising)
# f['key']=50
# f.close()
#
# f1=shelve.open('shelve_file01',flag='r')
# existing01=f1['key']
# print(existing01)
# f1.close()

# 由于shelve在默认情况下是不会记录
# 待持久化对象的任何修改的,
# 所以我们在shelve.open()
# 时候需要修改默认参数,否则对象的修改不会保存  writeback=True
# f1=shelve.open('shelve_file03')
# f1['k1']={'value':123,'new_value':'one'}
# print(f1['k1'])
# f1['k1']['new_value']='first'
# print(f1['k1'])
# f1.close()

#shelve.open(filename,writeback=True  )
# f2=shelve.open('shelev_file04',writeback=True)
# f2['k1']={'value':123,'new_value':'one'}
# print(f2['k1'])
# f2['k1']['new_value']='first'
# print(f2['k1'])
# f2.close()

 

 

 

7 re模块:

  

'''
   模块
       re模块
       正则表达式------字符串匹配
           正则表达式本身也和python没有什么关系 就是匹配字符串内容的一种规则
           官方定义
              正则表达式是对字符串操作的一种逻辑公式,
              就是用事先定义好的一些特定字符,及这些特定字符的组合
              ,组成一个 ‘规则字符串’,这个‘规则字符串’用来表达对字符串一种过滤逻辑


        正则字符组  [字符组]
          在同一个位置可能出现的各种字符组成了一个字符组,
          在正则表达式中用[]表示
          字符分为很多累,比如数字,字母,标点等等


          元字符:
            1 .      匹配除换行符以外的任意字符
            2 \w     匹配字母或数字或下划线
            3 \s     匹配任意的空白符
            4 \d     匹配数字
            5 \n     匹配一个换行符
            6 \t     匹配一个制表符tab
            7 \b     匹配一个单词的结尾
            8 ^      匹配一个字符串的开始
            9 $      匹配一个字符串的结束
            10 \W    匹配非字母或数字或下划线
            11 \D    匹配非数字
            12 \S    匹配非空白符
            13 a|b   或 a或则b
            14 ()    匹配括号内的表达式,也表示一个组
            15 [..]  匹配字符组中的字符
            16[^..]  匹配除字符组中字符的所有字符



            量词   用来约束元字符
            1 *       重复0次或更多次
            2 +       重复一次或更多次
            3 ?      重复0次或一次
            4{n}      重复n次
            5{n,}    重复n次或更多次
            6{n,m}    重复n到m次

            ()分组与 或 |  组合使用的时候要注意将长的放在前边
            可以将多个元字符放入一组
            后边在加量词可以约束组内的所有字节

            贪婪匹配和费贪婪匹配
             1 贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下采用贪婪
             2 非贪婪:在满足匹配时,匹配尽可能少的字符串

             几个常用的非贪婪匹配Pattern
                *? 重复任意次,但尽可能少重复
                +? 重复1次或更多次,但尽可能少重复
                ?? 重复0次或1次,但尽可能少重复
                {n,m}? 重复n到m次,但尽可能少重复
                {n,}? 重复n次以上,但尽可能少重复



 '''
import re


#  findall  返回所有满足匹配条件的结果 放在列表里
# ret01=re.findall('[a-z]+','eva egon yuan')
# ret01a=re.findall('a','eva egon yuan')
# print(ret01,ret01a)
# #   search
# #   从前往后走,找到一个就返回,返回的变量需要调用group才能拿到结果
# #   如果没有找到,那么就返回None 调用group回报错
# ret02=re.search('a','eva egon yuan').group()
# print(ret02)
# # match
# # 必须从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量
# # 匹配的内容需要用group才能显示
# #如果没有匹配上,就返回None 调用group回报错
# ret03=re.match('ev','eva egon yuan').group()
# print(ret03)
# #split分割
# #先按照a分割得到bcd,再按照b分割得到cd
# ret04=re.split('[ab]','abcd')
# print(ret04)
#
# #sub
# #将数字替换成H  参数2 代表替换了几次
# ret05=re.sub('\d','H','eva3egon4yuan5',2)
# print(ret05)
#
# #subn
# #将数字替换成H,返回元组,返回内容是(替换的结果,替换了几次)
# ret06=re.subn('\d','H','eva3egon4yuan5')
# print(ret06)
# #
# #compile 将正则表达式编译成一个正则表达式对象
# 应用场景  正则较长 且经常使用
# obj=re.compile('\d{3}')
# ret07=obj.search('abc123ccc')
# print(ret07.group())
# ret071=obj.search('abc456cccsadf1')
# print(ret071.group())

#finditer
#finditer 返回一个存放匹配结果的迭代器
#
# ret08=re.finditer('\d','dsf1dsf1e41gb1')
# print(ret08) #迭代器内存地址
# # # # print(next(ret08).group()) #取第一个值
# # # # print(next(ret08).group()) #取第二个值
# # print([i.group() for i in ret08])#列表推倒式
#
# for i in ret08:
#     print(i.group())




#  控制分组   可根据group的参数取回下标对应分组的值  下边例子就有2个分组
# import re
# ret=re.search('[1-9](?P<id>\d{14})(\d{2}[0-9x])?$','412702199002027515')
# print(ret.group())
# print(ret.group('id'))
# print(ret.group(1))
# print(ret.group(2))

#分组优先  findall的优先级查询
# ret09=re.findall('www.(baidu|jd).com','www.baidu.com')
# print(ret09)# 只返回['baidu'] 因为findall会优先把匹配结果 组内里的内容优先返回
# # 取消分组优先  在分组内 起始位置加入?  取消分组优先
# ret09a=re.findall('www.(?:baidu|jd).com','www.baidu.com')
# print(ret09a)
#
#
# #分组优先  split的优先级查询
# ret10=re.split("\d+","eva3egon4yuan")
# print(ret10) #结果 : ['eva', 'egon', 'yuan']
#
#
# #如果在正则上加上分组 会保留正则匹配的结果
# ret11=re.split("(\d+)","eva3egon4yuan")
# print(ret11) #结果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。


#引用分组 前后需要一样
# ret12=re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>helloword</h1>")#(?P=tag_name) 意思是引用前边分组名字且内容一致
# ret12a=re.search("<(?P<tag_name>\w+)>\w+</\1>","<h1>helloword</h1>")#  </\1> 中的\1意思是引用第一组的内容,且前后内容一致
# print(ret12.group())
# print(ret12a.group(1))
# print(ret12.group('tag_name'))

ret13=re.findall(r"\d+\d.\d+|(\d+)","1-2*(60+(-40.35/5))-(-4*3)")
print(ret13)
ret13.remove('')
print(ret13)

  

 

posted @ 2020-02-10 10:32  Yuan_x  阅读(212)  评论(0编辑  收藏  举报