模块

   今日类容

1.collection模块

2.时间模块

3.random模块

4.os模块

5.sys模块

6.序列化模块

7.subprocess模块

一  collection

0.普通的队列,先进先出

queue

 1 队列:现进先出(FIFO first in first out)
 2 import queue
 3 q = queue.Queue()  # 生成队列对象
 4 q.put('first')  # 往队列中添加值
 5 q.put('second')
 6 q.put('third')
 7 
 8 print(q.get())  # 朝队列要值
 9 print(q.get())
10 print(q.get())
11 print(q.get())  # 如果队列中的值取完了 程序会在原地等待 直到从队列中拿到值才停止
View Code

1.namedtuple:具名元组

  可以很方便的定义一种数据类型,他具备tuple的不可变性,也可以根据属性来引用,非常方便。

1 from collections import  namedtuple
2 point = namedtuple('p',['x','y'])
3 p = point(1,2)
4 print(p.x) #1
5 print(p.y) #2
View Code

2.deque:双端队列,可以快速的从另一侧追加和推出对象

  可以高效的实现插入和删除的双向列表,适用于队列和栈。

有四个方法:

  添加:append末尾添加,appendleft左边添加

  insert:可以往中间放 ,这是他不合理的地方

  取出:pop 右边取    , popleft左边取

1 from collections import deque
2 q= deque(['a','b','c'])
3 q.append('x')
4 q.appendleft('y')
5 print(q)
6  
7 #deque(['y', 'a', 'b', 'c', 'x'])
View Code

3.Counter: 计数器,主要用来计数

  是一个简单的计数器,目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储。其中元素为key,个数为value. 计数值可以是任意的interger(含0和负数)

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

4.OrdereDict: 有序字典 

  使用dict时,key是无序的,如果要保证key的顺序,可以用OrderedDict。OrderedDict的key是按照插入的顺序排列,不是key本身排序。 

1 from collections import OrderedDict
2 dic = dict([('a',1),('b',2),('c',3)])
3 dic1 = OrderedDict([('a',1),('b',2),('c',3)])
4 print(dic.keys()) #dict_keys(['a', 'b', 'c'])
5 print(dic1.keys()) #odict_keys(['a', 'b', 'c'])
View Code

5.defaultdict: 带有默认值的字典

  使用dict时,如果key不存在,则抛出KeyError,如果希望key不存在时,返回一个默认值,可以用defaultdict。

1 from collections import defaultdict
2 dic = defaultdict(lambda :'N/A')
3 dic['k1'] = 'abc'
4 print(dic['k1']) #‘abc’
5 print(dic['k2']) #N/A
View Code

二 时间模块

1.时间模块

时间模块分为三种表现形式:
  1.时间戳

  2.格式化时间(用来展示给人看的)

  3.结构化时间

1.显示时间戳,时间戳就是从1970,1,1

time.time

1 import time 
2 
3 print(time.time())
View Code

2.格式化时间,可以显示时间给人看的

指定打印时间句式'%Y-%m-%d %H:%M:%S'
 %X等价于%H:%M:%S
strftime
1 print(time.strftime('%Y-%m-%d'))
2 print(time.strftime('%Y-%m-%d %H:%M:%S'))
3 print(time.strftime('%Y-%m-%d %X'))  # %X等价于%H:%M:%S
4 print(time.strftime('%H:%M'))
5 print(time.strftime('%Y/%m'))
View Code
格式化时间补充:
 1 %y 两位数的年份表示(00-99 2 %Y 四位数的年份表示(000-9999 3 %m 月份(01-12 4 %d 月内中的一天(0-31 5 %H 24小时制小时数(0-23 6 %I 12小时制小时数(01-12 7 %M 分钟数(00=59 8 %S 秒(00-59 9 %a 本地简化星期名称
10 %A 本地完整星期名称
11 %b 本地简化的月份名称
12 %B 本地完整的月份名称
13 %c 本地相应的日期表示和时间表示
14 %j 年内的一天(001-36615 %p 本地A.M.或P.M.的等价符
16 %U 一年中的星期数(00-53)星期天为星期的开始
17 %w 星期(0-6),星期天为星期的开始
18 %W 一年中的星期数(00-53)星期一为星期的开始
19 %x 本地相应的日期表示
20 %X 本地相应的时间表示
21 %Z 当前时区的名称
22 %% %号本身
View Code

3.结构化时间,就是打印出来什么是什么的结果

1 print(time.localtime())
2 
3 print(time.localtime(time.time()))
4 res = time.localtime(time.time())
5 print(time.time())
6 print(time.mktime(res))
7 print(time.strftime('%Y-%m',time.localtime()))
8 print(time.strptime(time.strftime('%Y-%m',time.localtime()),'%Y-%m'))
View Code

4.datetime

 1  datetime
 2 import datetime
 3  print(datetime.date.today())  # date>>>:年月日
 4  print(datetime.datetime.today())  # datetime>>>:年月日 时分秒
 5  res = datetime.date.today()
 6  res1 = datetime.datetime.today()
 7  print(res.year)
 8  print(res.month)
 9  print(res.day)
10  print(res.weekday())  # 0-6表示星期  0表示周一
11 
12  print(res.isoweekday())  # 1-7表示星期 7就是周日
View Code
5.时间的计算
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象

1 current_time = datetime.date.today()  # 日期对象
2 timetel_t = datetime.timedelta(days=7)  # timedelta对象
3 res1 = current_time+timetel_t  # 日期对象
4 
5 print(current_time - timetel_t)
6 print(res1-current_time)
View Code

案例:

小练习 计算今天距离今年过生日还有多少天
1 birth = datetime.datetime(2019,12,21,8,8,8)
2 current_time = datetime.datetime.today()
3 print(birth-current_time)
View Code

UTC时间,跟当前时区相差8小时

1 dt_today = datetime.datetime.today()
2 dt_now = datetime.datetime.now()
3 dt_utcnow = datetime.datetime.utcnow()
4 print(dt_utcnow,dt_now,dt_today)
View Code


random模块
随机模块:import random
有一些常用的语句:
1.随机取一个你提供的整数范围内的数字  包含首尾
random.randint
1 print (random.randint(1,6))
View Code

2.随机取0-1之间小数

random.random

1 print(random.random())
View Code

3.摇号 随机从列表中取一个元素

random.choice

1 print(random.choice([1,2,3,4,5,6]))
View Code

4.可以把一个列表里的顺序打乱:也可以称之为洗牌

random.shuffle

1 res = [1,2,3,4,5,6]
2 random.shuffle(res) 
3 print(res)
View Code
random可以随机生成数字或字母组合的验证码
一般用于生成验证码,线上赌场发牌等等

那么这里我们写了一个生成随机验证码的例子
规则:
  大小写字母,小写字母,数字
  5位数的随机码验证,然几位后封装成一个函数,
  用户想生成几位就生成

 1 def get_code(n):
 2     code = ''
 3     for i in range(n):
 4         # 先生成随机的大写字母 小写字母 数字
 5         upper_str = chr(random.randint(65,90))
 6         lower_str = chr(random.randint(97,122))
 7         random_int = str(random.randint(0,9))
 8         # 从上面三个中随机选择一个作为随机验证码的某一位
 9         code += random.choice([upper_str,lower_str,random_int])
10     return code
11 res = get_code(4)
12 print(res)
View Code


四 os模块
os模块:跟操作系统打交道的模块
sys模块:跟python解释器打交道的模块(或者说应用程序)

os模块常用方法:
os.path.exists 判断文件是否存在
os.path.isfile 只能判断文件,不能判断文件夹
os.rmdir 只能删除空文件夹
os.chdir 切换当前所在的目录

os模块方法补充

 1 os.getcwd():  获取当前工作目录,(即当前Python脚本工作的目录路径)
 2 
 3   os.chdir('dirname'):  改变当前脚本的工作目录,相当于shell下的cd
 4 
 5   os.system('bash command'):  运行shell命令,直接显示(相当于启动一个全新的shell,然后去执行那条命令,命令执行完成过后,shell直接退出)
 6 
 7   os.curdir:  返回当前目录字符串名
 8 
 9   os.pardir:  返回当前目录的父目录的字符串名
10 
11   os.makedirs('dirname1/dirname2'):  可生成一个多层递归目录
12 
13   os.removedirs('dirname1'):  若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依次类推
14 
15   os.mkdir('dirname'):  创建一个目录
16 
17   os.rmdir('dirname'):  删除一个目录,若目录不为空则无法删除,报错
18 
19   os.listdir('dirname'):  显示指定目录下,所有的文件和子目录,包括隐藏文件
20 
21   os.remove():  删除文件
22 
23   os.rename('oldname','newname'):  重命名文件/目录,如果新的文件名/目录名已经存在,则会报错
24 
25   os.stat(' path/filename'):  获取文件/目录信息,并可以获取到文件的大小
26 
27   os.sep:  输出操作系统特定的路径分隔符 ,如:win 为‘\’,Linux为‘/28 
29   os.liesep:  输出当前平台使用的行终止符,如 win为 ‘	
’,Linux为‘
’
30 
31   os.pathsep:  输出用于分割文件路径的字符串
32 
33   os.name:  输出字符串指示当前使用平台,如 win ->'nt' ; Linux ->'posix'
34 
35   os.environ:  获取操作系统的环境变量
36 
37   os.path.abspath(path):  返回path规范化的绝对路径
38 
39   os.path.split(path):   将path分割成目录和文件名二元组返回
40 
41   os.path.dirname(path):  返回path的目录
42 
43   os.path.basename(path):  返回path最后的文件名(一个绝对路径只返回最后的文件名)
44 
45   os.path.exists(path):  判断路径是否存在,如果path存在,返回True;如果不存在,返回Flase
46 
47   os.path.isabs(path):  判断是否是绝对路径,如果是,则返回True
48 
49   os.path.isfile(path):  判断是否是一个文件
50 
51   os.path.isdir(path):  判断是否是一个存在的目录
52 
53   os.path.join(path1[,path2[,.......]]):  将路径和文件名分为一个列表中的两个元素,将它们拼起来
54 
55   os.path.getatime(path):  返回path所指向的文件或者目录的最后存取时间
56 
57   os.path.getmtime(path):  返回path所指向的文件或者目录的最后修改时间
58 
59   os.popen('dir'):  相当于打开了一个临时的文件存储打开的目录(可以赋给变量,字符串的形式) 
View Code

案例:


 1 import os
 2 BASE_DIR = os.path.dirname(__file__)
 3 MOVIE_DIR = os.path.join(BASE_DIR,'老师们的作品')
 4 movie_list = os.listdir(MOVIE_DIR)
 5 while True:
 6     for i,j in enumerate(movie_list,1):
 7         print(i,j)
 8     choice = input('你想看谁的啊(今日热搜:tank老师)>>>:').strip()
 9     if choice.isdigit():  # 判断用户输入的是否是纯数字
10         choice = int(choice)  # 传成int类型
11         if choice in range(1,len(movie_list)+1):  # 判断是否在列表元素个数范围内
12             # 获取用户想要看的文件名
13             target_file = movie_list[choice-1]
14             # 拼接文件绝对路径
15             target_path = os.path.join(MOVIE_DIR,target_file)
16             with open(target_path,'r',encoding='utf-8') as f:
17                 print(f.read())
18 
19 
20 
21 os.mkdir('tank老师精选')  # 自动创建文件夹
22 print(os.path.exists(r'D:Python项目day16
ion老师精选'))  # 判断文件是否存在
23 print(os.path.exists(r'D:Python项目day16老师们的作品	ank老师.txt'))  # 判断文件是否存在
24 print(os.path.isfile(r'D:Python项目day16	ank老师精选'))  # 只能判断文件 不能判断文件夹
25 print(os.path.isfile(r'D:Python项目day16老师们的作品	ank老师.txt'))  # 只能判断文件 不能判断文件夹
26 
27 os.rmdir(r'D:Python项目day16老师们的作品')  # 只能删空文件夹
28 
29 print(os.getcwd())
30 print(os.chdir(r'D:Python项目day16老师们的作品'))  # 切换当前所在的目录
31 print(os.getcwd())
32 
33 # 获取文件大小
34 print(os.path.getsize(r'D:Python项目day16老师们的作品	ank老师.txt'))  # 字节大小
35 with open(r'D:Python项目day16老师们的作品	ank老师.txt',encoding='utf-8') as f:
36     print(len(f.read()))
View Code

五 sys模块
sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运
行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:Python解释器。


sys模块的常用方法
import sys
sys.path.append() 将=某个路径添加到系统的环境变量中
print(sys.platfrom) 获取当前系统平台。
print(sys.version) python解释器的版本
print(sys.argv) 命令行启动文件,可以做身份的验证

案例 :

 1 if len(sys.argv) <= 1:
 2     print('请输入用户名和密码')
 3 else:
 4     username = sys.argv[1]
 5     password = sys.argv[2]
 6     if username == 'jason' and password == '123':
 7         print('欢迎使用')
 8         # 当前这个py文件逻辑代码
 9     else:
10         print('用户不存在 无法执行当前文件')
View Code

六 json模块  pickle模块

  JSON(Java Script Object Notation):一种轻量级数据交互格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。python的json模块序列化与反序列化的过程分别是encoding和decoding。

  • encoding:把一个python对象编码转换成Json字符串。
  • decoding:把json格式字符串编码转换成python对象。
json模块分为:序列化 和 反序列化

序列化:
  序列:字符串
  序列化:其他数据类型转换成字符串的过程
注意:1.写入文件的数据必须是字符串
   2.基于网络传输的数据必须是二进制 

反序列化:字符串转为其他数据类型,
  

json 模块:
  所有的语言都支持json格式
  但是支持的数据类型很少,只有 字符串,列表,字典,整型,元组(转成列表),布尔值

json一共就四个方法:

loads:反序列化  把json格式的字符串转换成其他数据类型

dumps:序列化  把其他数据类型转换为json格式的字符串

往文件里写用下面的

load:反序列化  将文件的内容转换成为json数据

dump:序列化  把json数据写入到文件中

案例:dunps loads
1 import json
2 d = {"name":"jason"}
3 print(d)
4 res = json.dumps(d)  # json格式的字符串 必须是双引号 >>>: '{"name": "jason"}'
5 print(res,type(res))
6 res1 = json.loads(res)
7 print(res1,type(res1))
View Code

案例:dump load

1 import json
2 d = {"name":"jason"}
3 with open('userinfo','w',encoding='utf-8') as f:
4     json.dump(d,f)  # 装字符串并自动写入文件
5 with open('userinfo','r',encoding='utf-8') as f:
6     res = json.load(f)
7     print(res,type(res))
View Code

注意:不能多次反序列化


案例:可以序列化多个和反序列化多个
 1 import json
 2 with open('userinfo','w',encoding='utf-8') as f:
 3     json_str = json.dumps(d)
 4     json_str1 = json.dumps(d)
 5     f.write('%s
'%json_str)
 6     f.write('%s
'%json_str1)
 7 
 8 
 9 with open('userinfo','r',encoding='utf-8') as f:
10     for line in f:
11         res = json.loads(line)
12         print(res,type(res))
13 t = (1,2,3,4)
14 print(json.dumps(t))
View Code

案例:在dumps的时候中文要指定编码,不然是二进制

d1 = {'name':'朱志坚'}
print(json.dumps(d1,ensure_ascii=False))默认是True,改为False就可以了

pickle模块

它只支持python,Python所有的数据类型都支持,
他有很大的弊端,就是不能跟其他平台交互,称之为孤儿,
在用pickle操作文件的时候,文件的打开模式必须是b模式
因为他会直接将对象转为二进制

案例:
1 d = {'name':'jason'}
2 with open('userinfo_1','wb') as f:
3     pickle.dump(d,f)
4 
5 with open('userinfo_1','rb') as f:
6     res = pickle.load(f)
7     print(res,type(res))
View Code


七 subprocess模块

sub :子
process:进程

模块详细解释:
 1 args: 要执行的shell命令,默认应该是一个字符串序列,如['df', '-Th']或('df', '-Th'),也可以是一个字符串,如'df -Th',但是此时需要把shell参数的值置为True。
 2 shell: 如果shell为True,那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性,如管道、文件名通配符、环境变量扩展功能,这将是非常有用的。当然,python本身也提供了许多类似shell的特性的实现,如glob、fnmatch、os.walk()、os.path.expandvars()、os.expanduser()和shutil等。
 3 check: 如果check参数的值是True,且执行命令的进程以非0状态码退出,则会抛出一个CalledProcessError的异常,且该异常对象会包含 参数、退出状态码、以及stdout和stderr(如果它们有被捕获的话)。
 4 stdout, stderr:input: 该参数是传递给Popen.communicate(),通常该参数的值必须是一个字节序列,如果universal_newlines=True,则其值应该是一个字符串。
 5 run()函数默认不会捕获命令执行结果的正常输出和错误输出,如果我们向获取这些内容需要传递subprocess.PIPE,然后可以通过返回的CompletedProcess类实例的stdout和stderr属性或捕获相应的内容;
 6 call()和check_call()函数返回的是命令执行的状态码,而不是CompletedProcess类实例,所以对于它们而言,stdout和stderr不适合赋值为subprocess.PIPE;
 7 check_output()函数默认就会返回命令执行结果,所以不用设置stdout的值,如果我们希望在结果中捕获错误信息,可以执行stderr=subprocess.STDOUT。
 8 universal_newlines: 该参数影响的是输入与输出的数据格式,比如它的值默认为False,此时stdout和stderr的输出是字节序列;当该参数的值设置为True时,stdout和stderr的输出是字符串。
 9 3. subprocess.CompletedProcess类介绍
10 需要说明的是,subprocess.run()函数是Python3.5中新增的一个高级函数,其返回值是一个subprocess.CompletedPorcess类的实例,因此,subprocess.completedPorcess类也是Python 3.5中才存在的。它表示的是一个已结束进程的状态信息,它所包含的属性如下:
11 
12 args: 用于加载该进程的参数,这可能是一个列表或一个字符串
13 returncode: 子进程的退出状态码。通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了
14 stdout: 从子进程捕获的stdout。这通常是一个字节序列,如果run()函数被调用时指定universal_newlines=True,则该属性值是一个字符串。如果run()函数被调用时指定stderr=subprocess.STDOUT,那么stdout和stderr将会被整合到这一个属性中,且stderr将会为None
15 stderr: 从子进程捕获的stderr。它的值与stdout一样,是一个字节序列或一个字符串。如果stderr灭有被捕获的话,它的值就为None
16 check_returncode(): 如果returncode是一个非0值,则该方法会抛出一个CalledProcessError异常
View Code

案列:

1.用户通过网络连接上了你的这台电脑
2.用户输入相应的命令 基于网络发送给了你这台电脑上某个程序
3.获取用户命令 里面subprocess执行该用户命令
4.将执行结果再基于网络发送给用户
这样就实现 用户远程操作你这台电脑的操作

1 while True:
2     cmd = input('cmd>>>:').strip()
3     import subprocess
4     obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
5     # print(obj)
6     print('正确命令返回的结果stdout',obj.stdout.read().decode('gbk'))
7     print('错误命令返回的提示信息stderr',obj.stderr.read().decode('gbk'))
View Code

 















原文地址:https://www.cnblogs.com/zahngyu/p/11210165.html