博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爱根,你消失一天,我如坠深渊!!!模块讲解,苑之恨!!!
阅读量:4612 次
发布时间:2019-06-09

本文共 8593 字,大约阅读时间需要 28 分钟。

time模块

在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:

(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

(2)格式化的时间字符串(Format String): ‘1988-03-16’。

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

import time#时间戳。print(type(time.time()))        #
时间戳print(time.time()) #1493189171.993524#时间的元组结构。print(type(time.localtime())) #
时间元组结构print(time.localtime()) #time.struct_time(tm_year=2017, tm_mon=4, tm_mday=26, tm_hour=14, tm_min=46, tm_sec=11, # tm_wday=2, tm_yday=116, tm_isdst=0)print(time.localtime().tm_year) #2017#时间字符串。print(type(time.strftime("%Y-%m-%d"))) #
时间字符串print(time.strftime("%Y-%m-%d---%X-%T")) #2017-04-26---14:50:45-14:50:45#将时间戳转化为结构时间。print(time.localtime(time.time()+86400).tm_mday) #27 将时间戳转化为结构时间,并显示日期。print(time.gmtime(time.time()).tm_hour) #7 将时间戳转化为格林尼治时间。小时数减去8。#将结构时间转化为时间戳。print(time.mktime(time.localtime()),time.time()) #1493190635.0 1493190635.0882084#将结构化时间转化为字符串时间。print(time.strftime("%Y-%m-%d--%T",time.localtime(time.time()+86400))) #2017-04-27--15:23:09#将字符串时间转化为结构时间。print(time.strptime("2019**09**30","%Y**%m**%d")) #time.struct_time(tm_year=2019, tm_mon=9, tm_mday=30, tm_hour=0, # tm_min=0, tm_sec=0, tm_wday=0, tm_yday=273, tm_isdst=-1) #将结构化时间转化为%a %b %d %H:%M %S %Y串print(time.asctime(time.localtime(1234567890))) #Sat Feb 14 07:31:30 2009#将时间戳转化为%a %b %d %H:%M %S %Y串print(time.ctime(1234567890)) #Sat Feb 14 07:31:30 2009
# 4 显示当前时间三天后是星期几? print(time.localtime(time.time()+3*86400).tm_wday)
 

                    random模块

 

import randomprint(random.random())          #大于0且小于1之间的小数。print(random.randint(1,5))      #大于1且小于等于5之间的整数。print(random.randrange(1,5))    #大于1且小于5之间的整数。print(random.choice([1,[1,4],"3"])) #取出列表中的一个。print(random.sample([1,[1,4],"3"],2))  #列表元素任意2个组合。print(random.uniform(1,5))      #大于1小于5的小数。i=[1,2,3,4,5]random.shuffle(i)  #打乱次序。print(i)#生成五位数验证码def yanzheng():    code=""    for i in range(5):        a=int(random.randint(0,9))        b=chr(random.randint(65,90))        c=random.choice([a,b])        code="%s%s"%(code,c)    return codeprint(yanzheng())

 

hashlib模块

          md5加密算法举例 import hashliba=hashlib.md5()a.update("egon".encode("utf8"))print(a.hexdigest())        #17374c698909042377e8db0abd350040a.update("egon".encode("utf8"))print(a.hexdigest())        #a128aaa8bc8ae8647e33701255cca92cb=hashlib.md5()b.update("egonegon".encode("utf8"))     #摘要算法。print(b.hexdigest())        #a128aaa8bc8ae8647e33701255cca92c

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

 
import hashlib sha1 = hashlib.sha1()sha1.update('how to use sha1 in ')sha1.update('python hashlib?')print sha1.hexdigest()
 

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:

如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

 
username | password---------+---------------------------------michael  | e10adc3949ba59abbe56e057f20f883ebob      | 878ef96e86145580c38c87f0410ad153alice    | 99b1c2188db85afee403b1536010c2c9
 

考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

 
'e10adc3949ba59abbe56e057f20f883e': '123456''21218cca77804d2ba1922c33e0151105': '888888''5f4dcc3b5aa765d61d8327deb882cf99': 'password'
 

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

 
hashlib.md5("salt".encode("utf8"))
 

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

                  OS模块

os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cdos.curdir  返回当前目录: ('.')os.pardir  获取当前目录的父目录字符串名:('..')os.makedirs('dirname1/dirname2')    可生成多层递归目录os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirnameos.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirnameos.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印os.remove()  删除一个文件os.rename("oldname","newname")  重命名文件/目录os.stat('path/filename')  获取文件/目录信息os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'os.system("bash command")  运行shell命令,直接显示os.environ  获取系统环境变量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不存在,返回Falseos.path.isabs(path)  如果path是绝对路径,返回Trueos.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回Falseos.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回Falseos.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间os.path.getsize(path) 返回path的大小

 

# 小程序:根据用户输入选择可以完成以下功能:# 创建文件,如果路径不存在,创建文件夹后再创建文件,      # 能够查看当前路径,                                # 在当前目录及其所有子目录下查找文件名包含指定字符串的文件。import osclass Os:    def __init__(self,choice,path,name=""):        self.path=path        self.name=name        self.choice=choice    def __setattr__(self, key, value):        if key=="choice":            a=getattr(Os,value)            a(self)        else:            self.__dict__[key]=value    def creat(self):        if os.path.exists(self.path):            os.chdir(self.path)            f = open(self.name,"w")            f.close()            print("有这个目录,已为你创建文件!")        elif not os.path.exists(self.path):            os.makedirs(self.path)            os.chdir(self.path)            f=open(self.name,"w")            f.close()            print("没有这个目录,已为你创建并生成文件")    def search(self):        print(os.getcwd())    def get(self):        getlist=[]        g=os.walk(self.path)        for i in g:            for j in i[-1]:                if self.name in j:                    file_path = os.path.join(i[0], j)                    getlist.append(file_path)        print(getlist)a=Os("get",r"a\b\c\d\e\f","a.txt")
#将三次登陆锁定的作业改为:python login.py -u alex -p 123456 输入的形式(-u,-p是固定的,分别代表用户名和密码)。import sysflag = Truename_list = []with open("user", encoding="utf8") as user_txt:    for line_user in user_txt:        name, psw = line_user.strip().split("---")        name_list.append(name)# while flag:input_name = sys.argv[2]if input_name not in name_list:    print("fuck you are not in the list!")    # continuewith open("user", encoding="utf8") as user_txt, open("black", encoding="utf8", mode="a+") as black_txt:    for line_user in user_txt:        name1, psw = line_user.strip().split("---")        if input_name == name1:            black_txt.seek(0)            count = 0            for line_black in black_txt:                name_black = line_black.strip()                if name_black == input_name:                    count += 1            if count < 3:                input_psw = sys.argv[4]                if input_psw == psw:                    flag = False                    print("welcome!fuck!")                else:                    black_txt.write("%s\n" % input_name)                    print("login again!")            if count == 3:                print("you have been locked!") 注意,必须将while去掉,因为sys.argv这个列表已经存在,那么里面的值会不断的被调用!!!
# 层级结构:#     dir1#     ---hello.py#     dir2#     ---main.py#     其中,hello.py:#     def add(x,y):#          return x+y# main.py如何能调用到hello.py中的add函数。import sysprint(sys.path)sys.path.insert(0,r"D:\PycharmProjects\py_fullstack_s4\day34\dir1")print(sys.path)import hello# from py_fullstack_s4.day34.dir1.hello import addprint(hello.add(1,2)) 

 

转载于:https://www.cnblogs.com/chedanlangren/p/6770626.html

你可能感兴趣的文章
contentType
查看>>
IBM简单提问。。。捂脸哭。。神马都不记得了。。。
查看>>
jQuery1.9.1--attr,prop与val方法源码分析
查看>>
javascript实现数据结构与算法系列:功能完整的线性链表
查看>>
gdb调试程序
查看>>
javascript 正则表达式
查看>>
MyBatis_01 框架
查看>>
中文写程序,何陋之有?
查看>>
(10)C#之ADO.NET 数据库中的NULL值的插入与读取
查看>>
字典 dict{}
查看>>
文件修改
查看>>
进阶:python3实现 插入排序
查看>>
IIS出现The specified module could not be found的解决方法
查看>>
【分享】JS图片滑动渐显渐隐插件-附使用方法。
查看>>
互联网产品的商业模式
查看>>
图的邻接表存储
查看>>
2018 leetcode
查看>>
各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
查看>>
PHP中获取当前页面的完整URL
查看>>
所谓输入掩码技术,即只有数字键起作用
查看>>