Day5- Python基础5 模块导入、time、datetime、random、os、sys、hashlib、json&pickle
本节目录:
1.模块的分类
2.模块的导入
3.time模块
4.datetime模块
5.random
6.os模块
7.sys模块
8.hashlib
9.json&pickle
一、模块的分类
Python流行的一个原因就是因为它的第三方模块数量巨大,我们编写代码不必从零开始重新造轮子,许多要用的功能都已经写好封装成库了,我们只要直接调用即可,模块分为内建模块、自定义的模块、安装的第三方的模块,一般都放在不同的地方,下面来看一下内建模块怎么导入,以及他们存放的位置。
import sys # 可以用import 直接导入内建模块 for i in sys.path: # sys.path存放有每次导入模块都会去搜寻的路径
print(i) '''
D:\pycharm2018\S3\s3基础\day9
D:\pycharm2018\S3 #自定义模块放在当前工作空间
F:\BaiduNetdiskDownload\python3.5.2\python35.zip
F:\BaiduNetdiskDownload\python3.5.2\DLLs
F:\BaiduNetdiskDownload\python3.5.2\lib #内建模块存放位置
F:\BaiduNetdiskDownload\python3.5.2
F:\BaiduNetdiskDownload\python3.5.2\lib\site-packages #第三方库的安装位置
'''
#可以向sys.path中用append()的方法导入,例如 sys.path.append('D:')后,在D:目录下的py文件可以用import直接导入
print(sys.platform) # win32 sys.platform可以获取当前工作平台(win32)or linux
#此外 sys.argv可以获取脚本的参数,argv[0] 是脚本名,argv[1]是第一个参数...
2.模块的导入
首先要说明下,自己定义的模块的名字和内建模块的名字不要相同,否则的话,导入的时候会出现问题,内建的模块,和第三方模块已经存在sys.path的路径中,所以直接导入即可,下面来说明下自己写了一个项目,项目中的各个库是如何导入的,假设我定义了一个modules的项目,下面是其目录结构看如何在1.py文件导入
上图左边是目录树,右边是在1.py文件中如何导入在lib/account.py下定义的函数,列举了三种常用导入方式。
[1]:import多次为什么只导入一次?
在sys.modules记录着呢
3.time模块
time差不多有8,9种的方法,可能很多,但是我们要记住一个基本的规则是什么。
时间戳
1:时间戳 就是一个秒数 他是从1970 1月1日0点开始算 到现在一共经历了多少秒 1970年他是Unix诞生
>>> time.time()
1520587685.2926712 给我们的意义就是做计算用的 计算经历了多长时间,你不用这个time.time 用什么?
结构化时间
2:结构化时间
time.localtime 本地的时间对象
time.gmtime utc的时间对象 以英国格林尼治时间化分24个时区,一个时区15° 1°是15分钟 我们东八区与utc时间相差8小时 >>> time.localtime()
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=9, tm_hour=17, tm_min=33, tm_se
c=9, tm_wday=4, tm_yday=68, tm_isdst=0) struct_time里面的每一个值都具有他特殊的意义:
tm_wday 一周的周几 周一对应0
tm_yday 一年的多少天 给我们的意义就是我们可以对这个时间对象,取得到任意你想要的值。
>>> t = time.localtime()
>>> t.tm_year
2018
>>> t.tm_wday
4
字符串时间
把时间戳或者结构化时间,变成我们直观可以接受的
import time #时间戳与结构化时间之间的互换
#时间戳转成结构化时间
print(time.localtime(123456)) #本地时间 (UCT)
print(time.gmtime(123456)) #标准时间
#结构化时间转成时间戳,必须传一个结构化时间的做参数
print(time.mktime(time.localtime())) #执行结果:
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=18, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)
1493193977.0 #结构化时间与字符串时间之间的转换
#结构化时间转成字符串时间
print(time.strftime('%Y-%m-%d %X',time.localtime()))#time.localtime()不写默认是当前时间
print(time.strftime('%Y-%m-%d %X',time.localtime(123456)))
#字符串时间转换成结构化时间
print(time.strptime('2017-4-21','%Y-%m-%d')) #字符串时间转成结构化时间 可以先查看下方法 #执行结果:
2017-04-26 16:06:17
1970-01-02 18:17:36
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=111, tm_isdst=-1)
你要是嫌麻烦,不想自己转成字符串时间,可以使用time.asctime() 或time.ctime()
>>> time.asctime() ##他的默认参数就是一个结构化时间
'Fri Mar 9 18:07:04 2018'
>>> time.ctime() ##他的默认参数是一个时间戳
'Fri Mar 9 18:11:17 2018'
>>> time.ctime(23) ##在上面的转化没有,涉及到时间戳和字符串的转化,你可以采用这个
'Thu Jan 1 08:00:23 1970'
>>> ##他们的参数不一样,但是最后都是字符串
其他的方法:
time.sleep(1) #参数秒,睡多少秒
4.datetime模块 (没啥好说的)
import datetime print(datetime.datetime.now()) ##这个会比time的asctime 和 ctime 好看多了
##2018-03-09 18:17:39.286773
其他的一些使用:
import datetime print(datetime.datetime.now()) # 2016-05-17 15:46:40.784376 获取当前的日期和时间
print(datetime.datetime.now()+datetime.timedelta(days=10)) # 2016-05-27 15:47:45.702528 将当前的时间向后推迟10天
print(datetime.date.today()) # 2016-05-17 获取当前的日期
print(datetime.datetime.utcnow()) # 2016-05-17 08:23:41.150628 获取格林威治时间 print(datetime.datetime.now().timetuple()) # time.struct_time(tm_year=2016 ... tm_hour=16,...)获取当前一个包含当前时间的结构体
print(datetime.datetime.now().timestamp()) # 1463473711.057878 获取当前的时间戳
print((datetime.datetime.fromtimestamp(1463473711.057878))) # 2016-05-17 16:28:31.057878 将时间戳转换成日期和时间
print(datetime.datetime.strptime('2016-05-17 16:28:31','%Y-%m-%d %H:%M:%S')) #2016-05-17 16:28:31 str转换为datetime
print(datetime.datetime.now().strftime('%D, %m %d %H:%M')) #05/23/16, 05 23 10:10 datetime转换为str
5.random模块
import random ret = random.random() ##随机输出 0 -1 之间的浮点数
ret = random.randint(1,3) ##[1-3]之间随机输出 为整数
ret = random.randrange(1,3) ## 和range(1,3)一样,顾头不顾尾
ret = random.choice([11,33,44]) ##从【11,33,44】这三个数字随机取出一个 各占百分之33的概率
ret = random.uniform(1,3) ##随机随机从1-3之间的浮点数 item =[1,3,4,5,6]
print(random.shuffle(item),item)
##输出 None [1, 6, 4, 5, 3] 打乱序列里面的值,场景,如打扑克牌 打乱排序
print(ret)
练习:4个验证码 数字和字母组合
import random
def v_code():
ret = ""
for i in range(0,5):
num = random.randint(0,9) ##随机0-9
alf = chr(random.randint(65,122))
s = str(random.choice([num,alf]))
ret += s
return ret print(v_code())
输出:
a2049
6.os模块
os模块是与操作系统交互的一个接口
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
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.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串
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不存在,返回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所指向的文件或者目录的最后修改时间
7.sys模块
修改环境变量的两种:
临时修改:
import sys
sys.path.append("d:\\") ###这里修改的是临时的
print(sys.path)
'''
['D:\\pycharm2018\\S3\\s3基础\\day9',
'D:\\pycharm2018\\S3',
'F:\\BaiduNetdiskDownload\\python3.5.2\\python35.zip',
'F:\\BaiduNetdiskDownload\\python3.5.2\\DLLs',
'F:\\BaiduNetdiskDownload\\python3.5.2\\lib',
'F:\\BaiduNetdiskDownload\\python3.5.2',
'F:\\BaiduNetdiskDownload\\python3.5.2\\lib\\site-packages',
'd:\\']
'''
永久修改:
点击我的电脑--右键属性--》点击高级属性设置--》点击环境变量--》找到path
将要添加的路径加入 用英文的; 进行分隔
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
练习进度条:
import sys,time
for i in range(10):
sys.stdout.write('#')
time.sleep(1)
sys.stdout.flush()
8.摘要算法:hashlib模块
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
注意:操作的是byte字节数据,如果是字符串str 则需要先转成字节 byte。
md5()方法
m = hashlib.md5()
m.update('hello'.encode('utf-8')) #字节数据
print(m.hexdigest()) #16进制的摘要算法结果
import hashlib
#
md5 = hashlib.md5() #调用md5算法
md5.update(b'hello') #对字节格式的文件进行摘要算法计算
print(md5.hexdigest()) #打印算法结果 'hello'
#5d41402abc4b2a76b9719d911017c592 md5.update(b'world') #对字节格式的文件进行摘要算法计算 作用的字节是'helloworld'将上一次的加入到当前文本前
print(md5.hexdigest()) #打印算法结果。
#fc5e038d38a57032085441e7fe7010b0
#假设大文件为helloworld,最后得出的结果与上边最后打印的world一致。可以认为摘要算法有自动叠加的功能!
import hashlib
md5 = hashlib.md5() #调用md5算法
md5.update(b'helloworld') #
print(md5.hexdigest()) #打印算法结果 与上边执行的摘要算法结果一致。
#fc5e038d38a57032085441e7fe7010b0
应用于:文件校验:大文件分块校验,防止文件过大导致的效率问题,最终传递的结果一样。
另一种常见的摘要算法是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加盐:
hashlib.md5("salt".encode("utf8"))
9.json & pickle 模块
用于序列化的两个模块
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)
注意的是:
这时候机智的你又要说了,既然pickle如此强大,为什么还要学json呢?
这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle
Day5- Python基础5 模块导入、time、datetime、random、os、sys、hashlib、json&pickle的更多相关文章
- python基础语法11 内置模块time,datatime,random,os,sys,hashlib模块
time模块 在python的三种时间表现形式: 1.时间戳: 给电脑看的. - 自1970-01-01 00:00:00到当前时间,按秒计算,计算了多少秒. 2.格式化时间(Format Strin ...
- python之常见模块(time,datetime,random,os,sys,json,pickle)
目录 time 为什么要有time模块,time模块有什么用?(自己总结) 1. 记录某一项操作的时间 2. 让某一块代码逻辑延迟执行 时间的形式 时间戳形式 格式化时间 结构化时间 时间转化 总结: ...
- 常用模块之 time,datetime,random,os,sys
time与datetime模块 先认识几个python中关于时间的名词: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“ty ...
- CSIC_716_20191116【常用模块的用法 time ,datetime, random, os, sys, hashlib】
import time import datetime import os import sys import random import hashlib time模块 时间戳(Timestamp) ...
- Python常用模块(time, datetime, random, os, sys, hashlib)
time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运 ...
- time,datetime,random,os,sys,hashlib,logging,configparser,re模块
#-----time模块----- print(help(time)) #打印time帮助文档 print(time.time()) #打印时间戳 1569824501.6265268 time.sl ...
- python笔记-1(import导入、time/datetime/random/os/sys模块)
python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...
- python笔记-6(import导入、time/datetime/random/os/sys模块)
一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其它内容待日后有深入理解了再来细说 1.import可以导入的两种不同的内容 1.1 *.py文件结尾的文件 ...
- Day 17 time,datetime,random,os,sys,json,pickle
time模块 1.作用:打印时间,需要时间的地方,暂停程序的功能 时间戳形式 time.time() # 1560129555.4663873(python中从1970年开始计算过去了多少秒) 格式化 ...
- Python——常用模块(time/datetime, random, os, shutil, json/pickcle, collections, hashlib/hmac, contextlib)
1.time/datetime 这两个模块是与时间相关的模块,Python中通常用三种方式表示时间: #时间戳(timestamp):表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. ...
随机推荐
- 《Dotnet9》系列之建站-Dotnet9建站20天感悟
本人站点 https://dotnet9.com,建站20天了,在这给站长朋友讲述个人建站经历,希望对大家能有所帮助. https://dotnet9.com 网站采用 宝塔 + WordPress ...
- C# 32位程序 申请大内存
后期生成事件命令行代码: cd /d $(DevEnvDir)cd..cd..cd VC\bineditbin /largeaddressaware $(TargetPath)
- Angular常用VSCode插件
1.Angular 8 Snippets(全家桶) 2.TSLint(ts代码规范.错误提示) 3.Material Icon Theme(文件图标) 4.One Dark Pro(主题) 5.Ang ...
- MongoDB(三):数据库操作、集合操作
1. 数据库操作 看完前面的文章,大家应该把环境搭建好了,下面我们就开始学习MongoDB的一些基本操作了. 首先我们要了解的一些要点: MongoDB将数据存储为一个文档,数据结构由键值对(key= ...
- 华为开发者联盟 方舟编译器 DevEco IDE
华为开发者联盟 https://developer.huawei.com/consumer/cn/ 方舟编译器是为支持多种编程语言.多种芯片平台的联合编译.运行而设计的统一编程平台,包含编译器.工具链 ...
- 十分钟 CODING DevOps 全链路体验
近期 CODING 团队在 2019 KubeCon 大会上发布 DevOps 一站式解决方案:CODING 2.0.此次 CODING 全新上线了持续集成与制品库模块,通过自动化与标准化的方式来帮助 ...
- Cocos2d-x 点击菜单按键居中放大(无需修改底层代码)
建议转至该处阅读 https://www.zybuluo.com/tangyikejun/note/21953 配置环境:win7+Cocos2d-x.2.0.3+VS2012 目标读者:已经了解Co ...
- vue.set( target, key, value ) this.$set(对象获数组,要更改的具体数据,重新赋值)用法
调用方法:Vue.set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值 具体用法js代码: //设 ...
- center----Iframe 用法的详细讲解
把iframe解释成“浏览器中的浏览器“很是恰当 <iframe frameborder=0 width=170 height=100 marginheight=0 marginwidth=0 ...
- @ImportResource
1. @ImportResource(locations = {"classpath:beantest.xml"})标注到启动类上,从类路径下加载xml文件,通过Applicati ...