常用模块

一. random模块

1.取随机小数
1.1random.random()  取0-1之间的随机小数
1 print(random.random())
2 # 0.38718361352206576
3 # 0.11848180963339394
1.2 random.uniform(a,b)  取a-b之间的随机小数
1 print(random.uniform(1,3))
2 # 2.2563287106900045
3 # 1.8587743420445906
2.取随机整数
功能:彩票,抽奖
1 random.randint(a,b)   取a-b之间的随机整数,顾头也顾尾
1 print(random.randint(1,5))
2 # 5
3 # 3
2.2random.randrange(a,b,c)   在a-b之间没隔c个数之间的数随机取值,顾头不顾尾
1 print(random.randrange(1,10,2))
2 # 9
3 # 1
3.从列表中随机抽取一个值
功能:抽奖
3.1 random.choic()  从列表中随机抽取一个值
1 lis=['a','b',(1,2,3),2]
2 print(random.choice(lis))
3 # 2
4 # b
3.2 random.sample(a,b)  从a列表中随机抽取b个值
1 lis=['a','b',(1,2,3),2]
2 print(random.sample(lis,2))
3 # [(1, 2, 3), 2]
4 # ['b', 2]
4. 打乱列表顺序
功能:洗牌
1 lis=['a','b',(1,2,3),2]  #是改变原列表的顺序,而不是产生新的列表,为了节省空间
2 random.shuffle(lis)
3 print(lis)  #['b', 2, (1, 2, 3), 'a']
例题:随机生成验证码
四位数字验证码:
1 s=''
2 for i in range(4):
3     a=random.randint(0,9)
4     s+=str(a)
5 print(s)
View Code
六位数字验证码:
1 s=''
2 for i in range(6):
3     a=random.randint(0,9)
4     s+=str(a)
5 print(s)
View Code
函数版本的数字验证码:
1 def func(n):
2     s=''
3     for i in range(n):
4         a=random.randint(0,9)
5         s+=str(a)
6     print(s)
7 func(4)
8 func(6)
View Code
六位数字和字母的验证码:
1 s=''
2 for i in range(6):
3     alpha_upper=random.randint(97,122)
4     alpha_lower=random.randint(65,90)
5     num=random.randint(0,9)
6     result=random.choice([chr(alpha_upper),chr(alpha_lower),num])
7     s+=str(result)
8 print(s)
View Code
函数版本
 1 def func(n=4):
 2     s=''
 3     for i in range(n):
 4         alpha_upper=random.randint(97,122)
 5         alpha_lower=random.randint(65,90)
 6         num=random.randint(0,9)
 7         result=random.choice([chr(alpha_upper),chr(alpha_lower),num])
 8         s+=str(result)
 9     print(s)
10 func(4)
11 func(6)
View Code
可以选择是否要字母的函数版
 1 def func(n=6,alpha=True):
 2     import random
 3     s=''
 4     for i in range(n):
 5         if alpha==True:
 6             alpha_upper=chr(random.randint(65,90))
 7             alpha_lower=chr(random.randint(97,122))
 8             num=random.randint(0,9)
 9             resule=random.choice([alpha_upper,alpha_lower,str(num)])
10             s+=resule
11         else:
12             num = random.randint(0, 9)
13             s += str(num)
14     return s
15 print(func(n=4,alpha=False))
View Code
发红包
 1 def func(money,num):
 2 #     import random
 3 #     lis=[]
 4 #     for i in range(int(num)):
 5 #         d=random.uniform(0,int(money))
 6 #         lis.append(d)
 7 #     lis=sorted(lis)
 8 #     # print(lis)
 9 #     for i in range(int(num)):
10 #         content=input('请输入抢:')
11 #         if content=='抢':
12 #             if i==0:
13 #                 print(lis[0])
14 #             else:
15 #                 print(lis[i]-lis[i-1])
16 #         else:
17 #             print('输入错误!')
18 # func(100,10)
View Code

二.时间模块(time)

时间格式:
字符串数据类型 格式化时间:2018-8-18 2018/08/18
结构化时间
时间戳时间 浮点型数据类型 154655862586.656463
时间戳时间是计算机能够识别的时间,字符串时间是人能看懂的时间,结构化时间是用来操作时间的
时间戳.时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
print(time.time())  #1534754474.7657013
字符串
1 print(time.strftime('%Y-%m-%d %H:%M:%S'))  #2018-08-20 16:54:31
结构化时间
1 print(time.localtime())  #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=56, tm_sec=15, tm_wday=0, tm_yday=232, tm_isdst=0)
2 struct_time=time.localtime()
3 print(struct_time)
4 print(struct_time.tm_mon)  #8
5 tm_wday=0是一周的第几天,周一是第零天
时间格式之间的转换:

把时间戳时间1434757080.275697转换成字符串时间
1 struct_time=time.localtime(1434757080.275697)
2 print(time.strftime('%Y-%m-%d %H:%M:%S',struct_time))
把字符串时间1434757080.275697转换成时间戳时间
1 struct_time=time.strptime('2015-06-20 07:38:00','%Y-%m-%d %H:%M:%S')
2 print(time.mktime(struct_time))
计算时间差:
 1 struct_time1=time.strptime('2018-8-8','%Y-%m-%d')
 2 a=time.mktime(struct_time1)
 3 struct_time2=time.strptime('2016-6-9','%Y-%m-%d')
 4 b=time.mktime(struct_time2)
 5 c=a-b
 6 print(c)
 7 struct_time3=time.gmtime(c)
 8 print(struct_time3.tm_year)
 9 print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time3.tm_year-1970,struct_time3.tm_mon-1,
10                                  struct_time3.tm_mday-1,struct_time3.tm_hour,
11                                  struct_time3.tm_min,struct_time3.tm_sec))
View Code

三.sys模块(和python解释器打交道)

1.sys.argv #argv的第一个参数是python这个命令后面的值,在cmd或terminal中可以验证
sys.argv的作用就是可以避免程序一开始就停下来,利于抢占CPU
1 print(sys.argv)
2 user=sys.argv[1]
3 pwd=sys.argv[2]
4 if user=='a' and pwd=='b':
5     print('成功')
6 else:
7     print('失败')
2.sys.path(显示导入的模块所在的位置路径,但不能直接找到,而是他的上一层)
1 print(sys.path)
模块是存在在硬盘上的,一但import了这个模块,这个模块才会到内存中,一个模块能否顺利导入全看sys.path中有没有这个模块存在
自定义模块导入模块的时候,需要关注sys.path
3.sys.modules
1 print(sys.modules)  #是我们导入到内存中所有模块的名字
2 print(sys.modules['re'])  #<module 're' from 'C:\\Program Files\\Python36\\lib\\re.py'>

四.os模块(和操作系统交互的模块)

1.文件夹/文件相关
1 os.makedirs('dir1/dir2')#创建多个文件夹(多层)
2  os.mkdir('dir3')   #只能创建单个文件夹
3  os.rmdis('dir1/dir2')  #只能删除单个文件夹
4  os.removedirs('dir1/dir2') #可以删除多个多层文件,若dir1下除了dir2还有其他文件不删dir1
5  os.listdir('C:/Users')  #显示当前文件夹下的所有文件和子目录
6  os.remove()  #删除一个文件
7  os.rename()   #重命名一个文件
8  os.stat()  #获取文件的相关信息
 1 st_mode: inode 保护模式
 2 st_ino: inode 节点号。
 3 st_dev: inode 驻留的设备。
 4 st_nlink: inode 的链接数。
 5 st_uid: 所有者的用户ID。
 6 st_gid: 所有者的组ID。
 7 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
 8 st_atime: 上次访问的时间。
 9 st_mtime: 最后一次修改的时间。
10 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
stat 结构

2.操作系统命令相关

1 os.system('dir')     #执行的是字符串类型的命令行代码(shell命令),没有返回值  (exec)
2 os.popen('dir')    #执行的是字符串类型的命令行代码(shell命令) ,并获取执行结果 (eval)
3
os.getcwd() #current work dir获取当前工作目录

4 os.chdir('D:') 切换当前的工作目录

3.路径相关

1 功能1:把路径中不符合规范的'/'改成操作系统默认的格式(Windows默认的是'\',Linux默认的是'/')
2 path=os.path.abspath('C:/Users/Administrator/PycharmProjects/untitled3/day18w4/练习.py')
3 print(path)  #C:\Users\Administrator\PycharmProjects\untitled3\day18w4\练习.py
4 
5 功能2:把能够找到的相对路径改成绝对路径
6 path=os.path.abspath('练习.py')
7 print(path)  #C:\Users\Administrator\PycharmProjects\untitled3\day18w4\练习.py
os.path.abspath() 返回path规范化的绝对路径
 1 os.path.split()  #把一个路径分成两段得到的是一个元组,元组的第二项是路径的最后一段(文件或文件夹)
 2 os.path.dirname()  #os.path.split()的第一项
 3 os.path.basename()  ##os.path.split()的第二项
 4 os.path.exists() #判断文件或文件夹是否存在  用于用户登录代码中,防止用户第二次登录时再次创建文件而发生错误
 5 os.path.isabs()  #判断一个路径是否是绝对路径
 6 os.path.isdir()  #判断这个路径找到的是不是一个文件夹
 7 os.path.isfile()  #判断这个路径找到的是不是一个文件
 8 '\@'.join(path)  #将''中的每一个东西拼接到给的路径的每一个元素后面,不包括\/
 9 os.path.join('c:', path)  # 将两个路径拼接成一个路径,与上面不同的是这个可以兼容linx(/)和windows(\)
10 os.path.getatime()  #返回这个文件的最后访问时间
11 os.path.getmtim()  #返回这个文件的最后修改时间
12 os.path.getsize()   #查看文件大小(所有的文件夹至少都是4096个字节)
使用python代码来统计一个文件夹中所有文件的大小
def func(path):
    size=0
    name_list=os.listdir(path)
    for name in name_list:
        path_abs=os.path.join(path,name)
        if os.path.isdir(path_abs):
            size_inner=func(path_abs)
            size +=size_inner
        else:
            size+=os.path.getsize(path_abs)
    return size
ret=func('C:/Users/Administrator/PycharmProjects/untitled3')
print(ret)
递归版本的:
 1 lst=[r'C:/Users/Administrator/PycharmProjects/untitled3',]
 2 # size_sum=0
 3 # while lst:
 4 #     path=lst.pop()
 5 #     path_list=os.listdir(path)
 6 #     for name in path_list:
 7 #         abs_path=os.path.join(path,name)
 8 #         if os.path.isdir(abs_path):
 9 #             lst.append(abs_path)
10 #         else:
11 #             size_sum+=os.path.getsize(abs_path)
12 # print(size_sum)
循环版本的:

五.序列化模块

为什么要序列化

为什么要把其他数据类型转换成字符串呢

能够在网络上传输的只能是bytes,能够存储在文件里的只有bytes和str

1.json模块

在内存中做数据转换
1 json.dumps()   #序列化
2 json.loads()   #反序列化
3 
4 # dic={'专业的':'我','业余的':'别人'}
5 # ret=json.dumps(dic,ensure_ascii=False)  #序列化
6 # print(ret)  #{"\u4e13\u4e1a\u7684": "\u6211", "\u4e1a\u4f59\u7684": "\u522b\u4eba"}
7 
8 # ret1=json.loads(ret)   #反序列化
9 # print(ret1)   #{'专业的': '我', '业余的': '别人'}
 1 # 向文件中记录字典
 2 # dic={'专业的':'我','业余的':'别人'}
 3 # ret=json.dumps(dic,ensure_ascii=False)
 4 # with open('json_file','a',encoding='utf-8') as f:
 5 #     f.write(ret)  #{"专业的": "我", "业余的": "别人"}
 6 
 7 #从文件中读取文件
 8 # with open('json_file','r',encoding='utf-8') as f:
 9 #     str_dic=f.read()
10 # print(json.loads(str_dic))  #{'专业的': '我', '业余的': '别人'}
11 # 可以在json_file的字典中手动添加其他的键值对,但是引号必须要用双引号,单引号是不识别的而且会报错
例子
直接将数据类型写入文件
1 json.dump()
2 json.load()
3 #     直接将数据类型写入文件
4 # dic={'专业的':'我','业余的':'别人'}
5 # with open('json_file','a',encoding='utf-8') as f:
6 #     json.dump(dic,f)
7 
8 # with open('json_file','r',encoding='utf-8') as f:
9 #     print(json.load(f))
json的dump和load是直接操作文件的,而dumps和loads是操作内存的
但是json模块能够处理的数据类型是非常有限的:字符串,列表,字典(字典中的可以只能是字符串),int,如果是其他数据类型的话,无法精确的反序列化
因为这些数据类型在所有语言中都是通用的,在python中序列化了,在Java等其他语言环境中也可以反序列化

 1 dic={'专业的':'','业余的':'别人'}
 2 # with open('json_file','a',encoding='utf-8') as f:
 3 #     json.dump(dic,f)
 4 #     json.dump(dic,f)
 5 #     json.dump(dic,f)
 6 #     json.dump(dic,f)
 7 # with open('json_file','r',encoding='utf-8') as f:
 8 #     print(json.load(f))#支持多次dump,但不支持多次load
 9 
10 # dic={'专业的':'我','业余的':'别人'}
11 # with open('json_file','a',encoding='utf-8') as f:
12 #     str_dic=json.dumps(dic)
13 #     f.write(str_dic+'\n')
14 #     f.write(str_dic+'\n')
15 #     f.write(str_dic+'\n')
16 # with open('json_file','r',encoding='utf-8') as f:
17 #     for line in f:
18 #         print(json.loads(line.strip()))
多次dump多次load
1 data = {'username':['李华','二愣子'],'sex':'male','age':16}
2 json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
3 print(json_dic2)
2.pickle模块 (只能在python中使用)
⑴pickle支持在python中的几乎所有数据类型
1 dic={(1,2,3):{'a','b'},1:'abc'}
2 ret=pickle.dumps(dic)  #
View Code
⑵ dumps序列化的结果只能是字节,此时的字节解码了也看不懂,只有pthon能认识
1 dic={(1,2,3):{'a','b'},1:'abc'}
2 ret=pickle.dumps(dic)  #
3 # print(ret)  #b'\x80\x03}q\x00(K\x01K\x02K\x03\x87q\x01cbuiltins\nset\nq\x02]q\x03(X\x01\x00\x00\x00bq\x04X\x01\x00\x00\x00aq\x05e\x85q\x06Rq\x07K\x01X\x03\x00\x00\x00abcq\x08u.'
4 ret1=pickle.loads(ret)
5 print(ret1)  #{(1, 2, 3): {'a', 'b'}, 1: 'abc'}
View Code
⑶ 只能在python中使用
 1 dic={(1,2,3):{'a','b'},1:'abc'}
 2 with open('pickle_file','wb') as f:
 3     pickle.dump(dic,f)
 4 �}q (KKK�qcbuiltins
 5 set
 6 q]q(X   bqX   aqe�qRqKX   abcqu.
 7 
 8 with open('pickle_file','rb') as f:
 9     ret=pickle.load(f)
10     print(ret)  #{(1, 2, 3): {'a', 'b'}, 1: 'abc'}
View Code
⑷在和文件操作的时候,需要用rb,wb的模式打开文件
(5)pickle可以多次dump和load
 1 dic1={(1,2,3):{'a','b'},1:'abc'}
 2 dic2={(1,2,3):{'a','b'},2:'abc'}
 3 dic3={(1,2,3):{'a','b'},3:'abc'}
 4 with open('pickle_file','wb') as f:
 5     pickle.dump(dic1,f)
 6     pickle.dump(dic2,f)
 7     pickle.dump(dic3,f)
 8 with open('pickle_file','rb') as f:
 9     ret=pickle.load(f)
10     print(ret)
11     ret = pickle.load(f)
12     print(ret)
13     ret = pickle.load(f)
14     print(ret)
15 {(1, 2, 3): {'b', 'a'}, 1: 'abc'}
16 {(1, 2, 3): {'b', 'a'}, 2: 'abc'}
17 {(1, 2, 3): {'b', 'a'}, 3: 'abc'}
18 
19 with open('pickle_file','rb') as f:
20  while True:
21      try:
22          ret = pickle.load(f)
23          print(ret)
24      except EOFError:
25          break
26 {(1, 2, 3): {'a', 'b'}, 1: 'abc'}
27 {(1, 2, 3): {'a', 'b'}, 2: 'abc'}
28 {(1, 2, 3): {'a', 'b'}, 3: 'abc'}
View Code
posted @ 2018-08-20 21:26  ★行者尚★  阅读(213)  评论(0编辑  收藏  举报