Python中常用模块一
random模块
1 import random 2 3 # 应用数学计算 4 print(random.random()) # 取随机小数 范围是 0-1之间 5 6 # 应用抽奖 , 彩票 7 print(random.randint(1,10)) # 取随机整数, 范围是 1 - 10 顾头又顾尾 8 print(random.randrange(1,2)) # 取随机整数 , 范围是 1 - 2 顾头不顾尾 9 10 11 # 从列表中随机抽取 应用抽奖 12 l = ['a','b',('a','b','c'),123,[1,3]] 13 print(random.choice(l)) # 从列表中随机取出一个元素 14 print(random.choices(l)) # 从列表中随机取出一个元素,并且是以列表的形式返回 15 print(random.sample(l,2)) # 从列表中随机取出两个元素 16 17 # 打乱一个列表的顺序,可以洗牌 18 random.shuffle(l) # 打乱列表的顺序 ,没有返回值, 在原列表中打乱 19 print(l)
随机验证码 函数版 可以自己更改位数
1 import random 2 def YZM(n=6,fal = True): 3 s = "" 4 for i in range(n): 5 num = str(random.randint(0,9)) # 随机数字 6 if fal: 7 apl1 = chr(random.randint(65,90)) # 随机大写字母 8 apl2 = chr(random.randint(97,122)) # 随机小写字母 9 num = random.choice([num,apl1,apl2]) # 从三个中随机再取出一个 10 s += num 11 return s 12 print(YZM(4))
发红包 拼手气红包
1 import random 2 def red_packet(money,num): 3 money = money * 100 4 ret = random.sample(range(1,money),num-1) 5 ret.sort() 6 ret.insert(0,0) 7 ret.append(money) 8 for i in range(len(ret)-1): 9 yield (ret[i+1] - ret[i])/100 10 11 ret_g = red_packet(200,10) 12 for money in ret_g: 13 print(money)
1 import random 2 def Bonus(person,money): # 5,200 3 dict_person_money = {} 4 for i in range(person): 5 num = random.randint(1,100) # 99 99 99 99 99 6 dict_person_money["Person%s"%(i+1)] = num # person1:99 7 num_sum = 0 8 for i in dict_person_money: 9 num_sum += dict_person_money[i] # 5 * 99 = 495 10 for i in dict_person_money: # 99/495 1/5 * 200 = 40 11 x =round(dict_person_money[i]/num_sum*money,2) 12 dict_person_money[i] = '$%s'%x 13 return dict_person_money 14 15 result = Bonus(10,1) 16 print(result)
时间模块
1 import time 2 常用方法 3 time.sleep(2) # 当程序走到这里会停顿两秒 可以称睡眠 4 print("你好") 5 6 时间戳 7 print(time.time()) 8 9 time 模块主要是和时间打交道的 10 时间格式: 11 2018-08-20 16:20:30 字符串时间, 格式化时间 , 给人看的 12 结构化时间: 13 1534752966.3648965 浮点型数据类型, 以S为单位, 时间戳时间, 给计算机用的 14 时间戳时间是从伦敦时间 1970-1-1 00:00:00 开始计
格式化时间 , 结构化时间 , 时间戳时间
1 import time 2 3 # 格式化时间 4 print(time.strftime("%Y-%m-%d %H:%M:%S")) # str format time 5 # 2018-08-20 16:32:15 6 print(time.strftime('%y-%m-%d %H:%M:%S')) 7 # 18-08-20 16:33:38 8 print(time.strftime('%D')) 9 # 08/20/18 10 print(time.strftime('%c')) 11 # 伦敦时间 : Mon Aug 20 16:35:01 2018 12 13 14 # 结构化时间 15 bendi_time = time.localtime() # 北京时间 16 print(bendi_time) 17 # time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=40, tm_sec=27, tm_wday=0, tm_yday=232, tm_isdst=0) 18 print(bendi_time.tm_mon) # 显示月 19 # 8 20 21 # 时间戳时间 22 print(time.time()) 23 # 1534754582.3888912
格式化时间 , 结构化时间 , 时间戳时间 三者之间的转换
1 # 时间戳时间转化成字符串时间 2 import time 3 struct_time = time.localtime(1500000000) # 将时间戳转成结构化时间 4 print(struct_time) # 北京时间 5 # time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0) 6 print(time.gmtime(1500000000)) # 伦敦时间 7 # time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0) 8 ret = time.strftime("%Y-%m-%d %H:%M:%S",struct_time) # 将结构化时间转化成字符串时间 9 print(ret) 10 # 2017-07-14 10:40:00
1 # 字符串时间转化成时间戳时间 2 import time 3 struc_time = time.strptime("2018-08-16","%Y-%m-%d") # 将字符串时间转化成结构化时间 4 print(struc_time) 5 ret = time.mktime(struc_time) # 将结构化时间转化成时间戳时间 6 print(ret)
例题:
1 # 将当前时间的当前月的1号的时间戳取出来 2 import time 3 def benyue_time(): 4 struct_time = time.localtime() 5 st = time.strptime('%s-%s-01' % (struct_time.tm_year,struct_time.tm_mon),"%Y-%m-%d") # 按格式化时间取出年月,然后转成结构时间 6 get_time= time.mktime(st) #转成时间戳时间 7 return get_time 8 print(benyue_time())
1 # 计算时间差 2 import time 3 def get_time(n1,n2): 4 st1 = time.strptime(n1,"%Y-%m-%d %H:%M:%S") 5 st2 = time.strptime(n2,"%Y-%m-%d %H:%M:%S") 6 struct_time1 = time.mktime(st1) 7 struct_time2 = time.mktime(st2) 8 num1 = struct_time2 - struct_time1 9 time_cha = time.gmtime(num1) 10 return "经历了%s年%s月%s日%s时%s分%s秒" % (time_cha.tm_year-1970,time_cha.tm_mon-1,time_cha.tm_mday-1, 11 time_cha.tm_hour,time_cha.tm_min,time_cha.tm_sec) 12 13 print(get_time('2018-05-06 06:05:03',"2018-08-20 08:10:30"))
时间差 datetime
import datetime datetime.datetime # 获取年月日时分秒 datetime.date # 获取年月日 datetime.time # 获取时分秒 datetime.timedelta # 做时间差 now=datetime.datetime.now().date() # 获取当前时间的年月日 date=datetime.date(year=2018,month=11,day=18) print(now-datetime.timedelta(days=1)>date) # 时间比大小
import datetime now=datetime.datetime.now().date() # 今天 delta1=datetime.timedelta(days=1) # 昨天 delta2=datetime.timedelta(weeks=1) # 一周前 delta3=datetime.timedelta(weeks=4) # 4周前
sys模块
sys模块是与Python交互的一个接口
迷糊不懂
1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) 3 sys.version 获取Python解释程序的版本信息 4 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 5 sys.platform 返回操作系统平台名称
os模块
1 import os 2 os.makedirs('dir1/dir2') # 创建文件目录,一次性可以创建多级目录 3 os.mkdir("dir3/dir4") # 创建文件目录 只能创建单级目录 4 # 只能删除空文件夹 5 os.rmdir('dir1/dir2') # 删除单级目录 6 os.removedirs("dir3/dir4") #可以删除多级目录 前提是空文件夹 7 print(os.stat(r'E:\Python\day18') 8 print(os.listdir('E:\Python\day18')) # 列出指定目录下的所有文件和子目录,包括隐藏文件 并以列表的方式返回 9 os.rename("旧文件名","新文件名") # 重命名文件/目录 10 os.stat("path 路径") # 获取文件/目录信息 11 os.getcwd() # 获取当前工作目录,即当前Python脚本工作的目录路径 12 os.chdir('E:\Python\day18') # 切换当前的工作的目录 13 ret = os.path("dir") # 是和做查看类的操作 14 print(ret.read())
os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 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的大小
os.stat("path/filename") 获取文件/目录信息的结构说明
1 stat 结构: 2 3 st_mode: inode 保护模式 4 st_ino: inode 节点号。 5 st_dev: inode 驻留的设备。 6 st_nlink: inode 的链接数。 7 st_uid: 所有者的用户ID。 8 st_gid: 所有者的组ID。 9 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 10 st_atime: 上次访问的时间。 11 st_mtime: 最后一次修改的时间。 12 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
1 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 2 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 3 os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: 4 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 5
序列化模块
什么叫序列化------------------将原本的字典 , 列表 等内容转换成一个字符的过程叫做序列化.
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢? 没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)
序列化的目的
1 以某种存储形式使自定义对象持久化;
2 将对象从一个地方传递到另一个地方
3 是程序更具有维护性
json & pickle 模块
用于序列化的两个模块
一 json , 用于字符串和Python数据类型间进行转换
二 pickle , 用于Python特有的类型和Python的数据类型间进行转换
pickle 模块提供了四个功能 : dumps ,dump(序列化 , 存) , loads(反序列化 , 读) , load (不仅可以序列化字典 , 列表.... 可以把Python中任意的数据类型序列化)
1 import pickle 2 dic = {'k1':'v1','k2':'v2','k3':'v3'} 3 str_dic = pickle.dumps(dic) 4 print(str_dic) #一串二进制内容 5 6 dic2 = pickle.loads(str_dic) 7 print(dic2) #字典 8 9 import time 10 struct_time = time.localtime(1000000000) 11 print(struct_time) 12 f = open('pickle_file','wb') 13 pickle.dump(struct_time,f) 14 f.close() 15 16 f = open('pickle_file','rb') 17 struct_time2 = pickle.load(f) 18 print(struct_time2.tm_year)
1 # 需求 :就是想要把一个一个的字典放到文件中,再一个一个取出来??? 2 dic = {'key1' : 'value1','key2' : 'value2'} 3 4 with open('json_file','a') as f: 5 str_dic = json.dumps(dic) 6 f.write(str_dic+'\n') 7 str_dic = json.dumps(dic) 8 f.write(str_dic + '\n') 9 str_dic = json.dumps(dic) 10 f.write(str_dic + '\n') 11 12 with open('json_file','r') as f: 13 for line in f: 14 dic = json.loads(line.strip()) 15 print(dic.keys())
json
dumps loads
在内存中做数据转换 :
dumps 数据类型 转成 字符串 序列化
loads 字符串 转成 数据类型 反序列化
dump load
直接将数据类型写入文件,直接从文件中读出数据类型
dump 数据类型 写入 文件 序列化
load 文件 读出 数据类型 反序列化
json是所有语言都通用的一种序列化格式
只支持 列表 字典 字符串 数字
字典的key必须是字符串