collections模块

time模块

random模块

os模块

sys模块

collections模块


这个模块实现了一些很好的数据结构,它们能帮助你解决各种实际问题

在这里主要介绍几种数据结构,帮助我们多了解不同数据类型。

1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
from collections import namedtuple
Point = namedtuple('point',['x','y','z']) #用可命名的元组,更直观表示空间一个点
p1 = Point(1,2,3) #Point类似一个类,此处实例化了一个名为p1的对象
p2 = Point(3,2,1)
print(p1.x)
print(p1.y)
print(p1,p2)
>>>>
1
2
point(x=1, y=2, z=3) point(x=3, y=2, z=1) #类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:
#namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

namedtuple

#deque指的是双端队列
#所以我们先来学一下什么是队列
#队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列
#队列是先进先出,栈是先进后出 import queue
q = queue.Queue()
q.put([1,2,3])
q.put(5)
q.put(6)
print(q)
print(q.get()) #先得到[1,2,3]
print(q.get()) #再拿到5
print(q.get()) #最后拿到6
#此时已经取尽队列的值了,再用get方法,取不到值,队列会一直等在这里,就称为队列的阻塞,需要再给值才能继续运行
print(q.get()) # 阻塞
print(q.qsize()) #size为3 #deque 双端队列
#使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
#deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque
dq = deque([1,2])
dq.append('a') # 从后面放数据 [1,2,'a']
dq.appendleft('b') # 从前面放数据 ['b',1,2,'a']
dq.insert(2,3) #['b',1,3,2,'a']
print(dq.pop()) # 从后面取数据
print(dq.pop()) # 从后面取数据
print(dq.popleft()) # 从前面取数据
print(dq)

deque

#使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
#如果要保持Key的顺序,可以用OrderedDict:
#有序字典
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
print(od['a'])
for k in od:
print(k) #注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']

OrderedDict

#有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66} from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list) #设置了一个默认字典,字典默认valu是一个列表
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value) #使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'

defaultdict

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

c = Counter('abcdeabcdabcaba')
print(c)
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

counter

time模块


和时间有关系的我们就要用到时间模块。在使用模块之前,应该首先导入这个模块。

表示时间的三种方式:

在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:
(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
(2)格式化的时间字符串(Format String): ‘1999-12-06’

#python中时间日期格式化符号:
%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)
%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 当前时区的名称
%% %号本身

python中时间日期格式化符号:

(3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为0

 时间模块的常用方法,及时间各个表示方式之间的转换:

import time

#时间的三种表示方式:

# 1.格式化时间 —— 字符串:直观显示时间
print(time.strftime("%Y-%m-%d %a %X") ) #%X 也可以替换为 %H:%M:%S HOUR MINUTES SECOND
#print(time.strftime("%Y/%m/%d %X") ) #%X 也可以替换为 %H:%M:%S HOUR MINUTES SECOND
也可以设置一个格式 time_format = "%Y-%m-%d %a %X" 然后 time.strftime(time_format) #2.时间戳时间 —— float时间,给计算机看的,是从 1970年1月1日00点00分开始计算的时间偏移量
t2 = time.localtime()
print(time.mktime(t2)) #将结构化时间转为时间戳,必须要有一个参数 #3.结构化时间 —— structtime,元组(九个变量),用来计算的
struct_time = time.localtime() #localtime 将时间戳返回一个结构化时间,默认为当前时间
print(struct_time)
print(struct_time.tm_year) #有点像 collections模块的 nametuple方法
#print(time.gmtime()) #格林威治时间,比我们晚八个小时,将时间戳返回为一个结构化时间
#print(time.strptime('2010-08-03 20:36:20 Mon','%Y-%m-%d %X %a')) #格式化时间转换为结构化时间 #时间戳转结构化时间
t = time.time() #获取当前时间的时间戳
print(time.localtime())
print(time.gmtime(t)) #格林威治时间,比我们晚八个小时,不用参数t也可以 # 结构化时间转为时间戳
t2 = time.localtime()
print(time.mktime(t2)) # 格式化时间转化为结构化时间
print(time.strptime('2010-08-03 20:36:20 Mon','%Y-%m-%d %X %a')) # 结构化时间转为格式化时间
print(time.strftime('%Y-%m-%d %X %a',time.localtime(1500000000))) #sleep
time.sleep(5) #先在这暂停5秒再往下运行

 小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的

#asctime 和 ctime

#asctime 和 ctime
#时间戳和结构化时间转换为固定格式的时间
print(time.asctime())
print(time.asctime(time.localtime(1500000000)))
>>>输出结果,下同
Sat Sep 8 10:09:09 2018
Fri Jul 14 10:40:00 2017
print(time.ctime())
print(time.ctime(1500000000))
#time模块作业,计算时间差
import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
struct_time.tm_mday-1,struct_time.tm_hour,
struct_time.tm_min,struct_time.tm_sec))

练习-计算时间差

random模块


随机模块:可以获取随机数值,及进行乱序排列等

>>> import random
#随机小数
>>> random.random() # 大于0且小于1之间的小数
0.7664338663654585
>>> random.uniform(1,3) #大于1小于3的小数
1.6270147180533838
#恒富:发红包 #随机整数
>>> random.randint(1,5) # 大于等于1且小于等于5之间的整数
>>> random.randrange(1,10,2) # 大于等于1且小于10之间的奇数 #随机选择一个返回
>>> random.choice([1,'',[4,5]]) # #1或者23或者[4,5]
#随机选择多个返回,返回的个数为函数的第二个参数
>>> random.sample([1,'',[4,5]],2) # #列表元素任意2个组合
[[4, 5], ''] #打乱列表顺序
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打乱次序
>>> item
[5, 1, 3, 7, 9]
>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]
import random

def v_code():

    code = ''
for i in range(5): num=random.randint(0,9)
alf=chr(random.randint(65,90))
add=random.choice([num,alf])
code="".join([code,str(add)]) return code print(v_code())

练习-生成验证码

os模块


os模块是与操作系统交互的一个接口

import os
print(os.getcwd()) #获取当前工作目录,即当前python脚本工作的目录路径
#os.chdir(r'C:\Users\15302\PycharmProjects\GKXXX\day14') #跟文件夹有关系的
os.makedirs('dirname1/dirname2') #创建多层递归目录
os.removedirs('dirname1/dirname2') #递归删除目录,如果2删除后,1里是空的,那么1也会被删除
os.mkdir('dirname') #只能创建单级目录
os.rmdir('dirname') #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
print(os.listdir(r'C:\Users\15302\PycharmProjects\GKXXX')) #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印os.remove('filename')#删除一个文件os.renames('old','new') #修改文件名字
print(os.stat('时间模块.py')) #获取文件/目录信息 stat打印出来的信息结构,最下方有说明
print(os.sep) #显示该操作系统路径的连接方式,用于python代码跨平台
print(os.linesep) #输出当前平台使用的行终止符
print(os.pathsep) #输入当前平台路径分割符 win是; linux是:
print(os.name) #输入当前平台操作系统是什么 nt 为 windows posix为Linux
os.system('dir') #参数是当前系统可以使用的命令,即可以在cmd里执行的,没有返回值
print(os.popen('dir').read()) #有返回值,类似 os.system
print(os.environ) #获取系统环境变量
print(os.listdir(os.getcwd())) #打印path下的目录,只打印一级别,目录下的子目录不会被打印

#path
os.path
os.path.abspath(path) #返回path规范化的绝对路径
os.path.split(path) #将path分割成目录和文件名二元组返回
os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) #如果path是绝对路径,返回True
os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) #返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) #返回path的大小,返回文件夹大小会不准,但是返回文件会准
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)是创建时间(详细信息参见平台的文档)。

stat 结构:

os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

os模块的属性

#导入OS包
import os
#os.getcwd()查看当前目录
print('\n当前目录位置:')
print(os.getcwd())
#os.chdir修改目录
os.chdir("E:\python_py\python1_learn")
print('\n修改后目录位置:')

更换工作路径

import os
import os.path
from collections import Counter
#windows ,给出一个路径,递归遍历所有文件;所有重名的文件,只保留一份,其余都删除。保留的文件目录未做限定
rootdir = r"F:\CloudMusic\Duomi"
dict1={} #存放遍历到所有文件的:全路径、文件名称
list1=[] #存放所有获取的文件名称,含重复文件名称
for parent, dirnames, filenames in os.walk(rootdir):
for filename in filenames:
dict1[os.path.join(parent, filename)]=filename #key:全路径,value:文件名称
list1.append(filename)
list2=[str(k) for k,v in dict(Counter(list1)).items() if v>1] #查询统计大于1的名称,存储
todeleteno=0 #统计删除总数
for l in list2: #遍历重名名称列表
n = 0 #计数,同一个名称内一次计数,计数为0不删除,自增后不为0则删除
for k,v in dict1.items(): #遍历 全路径、文件名称 字典
if l==v: #当字典value(文件名称)等于重名列表中字符
if n==0: #计数为0不删除
print('不删:{v}-----{k}'.format(v=v, k=k))
else: #自增后不为0则删除
todeleteno+=1
print('删除{n}:{v}-----{k}'.format(n=str(todeleteno).zfill(5),v=v, k=k))
#慎用删除,没事就注释掉
# os.remove(k)
n+=1
print("删除总数:"+str(todeleteno))

删除路径下所有同名文件

sys模块


sys模块是与python解释器交互的一个接口

#python解释器交互的模块
import sys
#print(sys.exit()) #退出当前程序,正常退出时exit(0),错误退出sys.exit(1)
#如果我这里退出了,下面都不会执行了
# print(sys.platform) #返回操作平台,但是只能区分大平台,32位还是64位区分不出来。。。
# print(sys.version) #获取pyhon解释程序的版本信息
# print(sys.path) #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
# sys.path.append(path) #当想导入自定义模块的时候,可以把自定义模块的路径加到 sys.path
# print(sys.modules.keys())
#当你要导入某个模块的时候,可以在这里找,是否已经导入过该模块

ret = sys.argv #有时候脚本没在pycharm运行,比如要放到服务器上运行,此时用cmd执行的时候,可以在脚本后面带上参数,比如用户名和密码
#通过argv就可以获取命令行参数,从而达到验证登陆信息,或者做其他事情
#比如以下代码在terminal运行:
# (venv) C:\Users\15302\PycharmProjects\GKXXX\day13>python sys模块.py gkx gkx123
# 登陆成功
# 你可以使用计算器了
name = ret[1] #其中argv返回的列表中 argv[0]是其文件名本身,注意在命令行空格才表示新元素,用逗号命令行会认为是同一个元素
pwd = ret[2]
if name=='gkx' and pwd == 'gkx123':
print('登陆成功')
else:
print('登陆失败,退出程序')
sys.exit()
print('你可以使用计算器了')
#注意以上程序在pycharm里面运行是报错的,只有在终端运行才可以

常用模块Part(1)的更多相关文章

  1. atitit 商业项目常用模块技术知识点 v3 qc29

    atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...

  2. 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块

    五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  ...

  3. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  4. 进击的Python【第五章】:Python的高级应用(二)常用模块

    Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigPar ...

  5. Python模块之常用模块,反射以及正则表达式

    常用模块  1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...

  6. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  7. day--6_python常用模块

    常用模块: time和datetime shutil模块 radom string shelve模块 xml处理 configparser处理 hashlib subprocess logging模块 ...

  8. Tengine 常用模块使用介绍

    Tengine 和 Nginx Tengine简介 从2011年12月开始:Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能 和特性. ...

  9. Saltstack常用模块及API

    Saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能.常用工具支持等,更多模块信息可以查看官网模块介绍.也可以通过sys模块列出当前版本支持的模块. salt '*' sys.list_ ...

  10. Ansible简介及常用模块

    一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...

随机推荐

  1. IDEA eclipse转maven

    在pom.xml 文件上右键 Add as Maven Project

  2. 对字符串md5加密

    public String getMD5(String str) { try { // 生成一个MD5加密计算摘要 MessageDigest md = MessageDigest.getInstan ...

  3. 第八篇——Struts2的处理结果类型

    Struts2处理结果类型 1.SUCCESS:表示Action正确的执行完成,返回相应的视图,success是name属性的默认值: 2.ERROR:表示Action执行失败,返回到错误处理视图: ...

  4. String 常用方法

    // 不会改变原字符串string.substring(startIndex, endIndex) —— 根据头尾位置返回一个字符串 string.substr(startIndex, length) ...

  5. JavaScript 作用域链其实很简单

    概念 作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问.其本质就是一个指向变量对象的指针列表.在js中,当某个函数被调用时,会创建一个执行环境(execution context)及 ...

  6. iptables 扩展匹配 第三章

    获取帮助: centos 6 :man iptables centos 7: man iptables-extensions 扩展匹配: 隐式扩展:当使用-p指定某一协议之后,协议自身所支持的扩展就叫 ...

  7. Docker Kubernetes 容器重启策略

    Docker Kubernetes 容器重启策略 当容器被创建时,容器会根据重启策略来进行容器重启. 支持三种策略: Always:当容器终止退出后,总是重启容器,默认策略. OnFailure:当容 ...

  8. SSM-网站后台管理系统制作(3)---Google的reCaptcha验证码

    网上找了好久,也不知道怎么接入,后来看到一篇博客才搞好 reCaptcha官网:https://www.google.com/recaptcha/admin#site/344147946 参考博客:h ...

  9. Windows server 2016安装Docker EE

    Windows server 2016安装Docker EE 下载 windows server 2016 180天评估版本. 地址:https://www.microsoft.com/en-us/e ...

  10. luogu3426 [POI2005]SZA-Template 后缀树

    链接 bzoj不能auto https://www.luogu.org/problemnew/show/P3426 思路 这个要求的串一定是S的前缀和S的后缀. 转化一下 建立出来fail树(fail ...