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. JAVA:IDEA使用Junit(3)

    1.配置 File ——> Project Structure ——> Libraries ——> + ——>搜索Junit类库 确认ok即可 2.编辑项目 选择创建 配置生成 ...

  2. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告

    1.环境准备: python3.6 requests xlrd openpyxl HTMLTestRunner_api 2.目前实现的功能: 封装requests请求方法 在excel填写接口请求参数 ...

  3. 52.JQ---向上滚动显示,向下滚动隐藏

    js: var windowTop = 0;$(window).scroll(function() { var scrolls = $(this).scrollTop(); if(scrolls &l ...

  4. centos7中安装、配置jdk(转载)

    参考命令:http://www.jb51.net/os/RedHat/73016.html来进行安装 安装说明 系统环境:centos7安装方式:rpm安装软件:jdk-8u25-linux-x64. ...

  5. OOP面向对象编程(下)

    我们怎么去模拟重载,在javasceipr中我们可以通过参数的类型区别或者数量的区别,来去让同样一个函数名字,可以根据不同的参数列表的情况来去调用相应的函数. javascript中函数类型是不确定的 ...

  6. Hbase 系统架构(zhuan)

    一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...

  7. 虚拟机VM三种网络连接方式说明

  8. 【Checkio Exercise】Robot Sort

    Robot Sort All of the refined ingots should be sorted by size in each lot while passing by on a conv ...

  9. netty如何实现零拷贝

    根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  10. webform-AJAX

    AJAX = 异步 JavaScript和XML(标准通用标记语言的子集).AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着 ...