day5----模块
1.定义
模块:用来从逻辑上组织python代码(变量,函数,类,运行逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test)
包:用来从逻辑上组织模块儿的,本质就是一个目录,必须带有一个__init__.py文件。
2.导入方法
import module_name
import module1_name,module2_name
from module_alex import *
from module_alex import module_name as module_name_alex(别名)
引用。
module_name.变量
module_name.函数
3.import本质(路径搜索和搜索路径)
导入模块的本质就是把python文件解释一遍
导入包的本质就是解释包下的__init__.py 文件
import module_name --->module_name.py ---->moudle_name.py的路径---->sys.path.apend(add)
4.导入优化
from module_alex import module_name
5.模块的分类
a.标准库
b.开源模块
c.自定义模块
自定义模块:
导入模块
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
import module from module.xx.xx import xx from module.xx.xx import xx as rename from module.xx.xx import *
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
通过os模块可以获取各种目录,例如
import sys import os pre_path = os.path.abspath('../') sys.path.append(pre_path)
内置模块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所指向的文件或者目录的最后修改时间
内置模块SYS
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
内置模块HASHLIB
import hashlib # ######## md5 ######## hash = hashlib.md5() hash.update('admin') print hash.hexdigest() # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print hash.hexdigest() # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print hash.hexdigest() # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print hash.hexdigest() # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print hash.hexdigest()
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
import hashlib # ######## md5 ######## hash = hashlib.md5('898oaFs09f') hash.update('admin') print hash.hexdigest()
random模块
import random checkcode = '' for i in range(4): current = random.randrange(0,4) if current != i: temp = chr(random.randint(65,90)) else: temp = random.randint(0,9) checkcode += str(temp) print checkcode
time & datetime模块
import time import datetime # time模块 print(time.clock()) # 输出=>3.110193534902903e-07 print(time.process_time()) # 输出=>0.031200199999999997 # 返回当前时间戳,即1970.1.1至今的秒数 print(time.time()) # 输出=>1454239454.328046 # 当前系统时间 print(time.ctime()) # 输出=>Sun Jan 31 19:24:14 2016 # 将当前时间戳转换成字符串格式的时间 print(time.ctime(time.time())) # 输出=>Sun Jan 31 19:24:14 2016 # 将时间戳转换成struct_time格式 print(time.gmtime(time.time())) # time.struct_time(tm_year=2016, tm_mon=1, tm_mday=31, tm_hour=11, tm_min=24, tm_sec=14, tm_wday=6, tm_yday=31, tm_isdst=0) # 将本地时间的时间戳转换成struct_time格式 print(time.localtime(time.time())) # time.struct_time(tm_year=2016, tm_mon=1, tm_mday=31, tm_hour=19, tm_min=24, tm_sec=14, tm_wday=6, tm_yday=31, tm_isdst=0) # 与上面的相反,将struct_time格式转回成时间戳格式。 print(time.mktime(time.localtime())) # 输出=>1454239454.0 # sleep # time.sleep(4) # 将struct_time格式转成指定的字符串格式 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))) # 输出=>2016-02-01 13:53:22 # 将字符串格式转成struct_time格式 print(time.strptime("2016-02-01", "%Y-%m-%d")) # time.struct_time(tm_year=2016, tm_mon=2, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=32, tm_isdst=-1) # datetime 模块 print(datetime.date.today()) # 输出=>2016-02-01 print(datetime.date.fromtimestamp(time.time() - 86640)) # 输出=>2016-01-31 current_time = datetime.datetime.now() print(current_time) # 输出=>2016-02-01 14:01:02.428880 # 返回struct_time格式的时间 print(current_time.timetuple()) # time.struct_time(tm_year=2016, tm_mon=2, tm_mday=1, tm_hour=14, tm_min=1, tm_sec=41, tm_wday=0, tm_yday=32, tm_isdst=-1) # 指定替换 # datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]) print(current_time.replace(2008, 8, 8)) # 输出=>2008-08-08 14:03:53.901093 # 将字符串转换成日期格式 str_to_date = datetime.datetime.strptime("2016-02-01", "%Y-%m-%d") print(str_to_date) # 输出=>2016-02-01 00:00:00 # 比现在+10d new_date = datetime.datetime.now() + datetime.timedelta(days=10) print(new_date) # 输出=>2016-02-11 14:46:49.158138 # 比现在-10d new_date = datetime.datetime.now() - datetime.timedelta(days=10) print(new_date) # 输出=>2016-01-22 14:53:03.712109 # 比现在+10h new_date = datetime.datetime.now() + datetime.timedelta(hours=10) print(new_date) # 输出=>2016-02-02 00:53:03.712109 # 比现在+120s new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) print(new_date) # 输出=>2016-02-01 14:55:03.712109
记录Python学习过程,给自己改变的机会。