常用模块:
1.time和datetime模块;
2.random模块;
3.os、sys和shutil模块;
4.json、pickle和shelve模块;
5.xml和ymal处理;
6.configparser和sbuprocess模块;
7.hashlib模块;
模块和包
1.概念
- 模块用来从逻辑上组织python代码(变量、函数、类,逻辑:实现某个功能),其本质就是以.py结尾的python文件。(例如:文件:test.py,对应的模块名:test);
- 包:用来从逻辑上组织模块,其本质就是一个目录(必须带有一个__init__.py文件);
2.导入方法
- import module_name:本质是将module_name解释一遍,并将解释结果赋值给module_name;
- from module_name import name:本质将module_name中的name变量放到当前程序中运行一边,所以调用的时候直接print(name)就可以打印出name变量的值,切记调用模块的时候只需要import模块名,不需要加.py;
- import module_name1, module_name2,...:导入多个模块;
- from module_name import name as nm:为导入模块取别名;
- from module_name import *(不建议使用该方法);
3.导入模块的本质就是把python文件解释一遍
import module_name ---> module_name.py ---> module_name.py的路径--->sys.path;
4.导入包的本质就是执行该包下面的__init__.py文件,所以如果想要调用包下面的python程序需要在包下的__init__.py导入需要的程序;
1.time与datetime模块
python中常见的时间表示方法:
a.时间戳;
b.格式化的时间字符串;
c.struct_time(元组);
time模块方法(来自于源代码):
import time
# 时间戳:返回从1970年1月1日00:00:00到现在为止的时间(单位为秒)
time_time = time.time()
print("time_time is %s" % time_time)
# struct time:返回UTC时间的struct格式;如果没有传参,则转换当前时间
gm_time = time.gmtime(time_time)
print("gm_time is {}".format(gm_time))
# struct time:返回本地时间的struct格式;如果没有传参,则转换当前时间
local_time = time.localtime()
print("local_time is {}".format(local_time))
# 返回处理器时间,3.3开始废弃,改成time.process_time()测量处理器运算时间,不稳定,mac上测不出来
clock_time = time.clock()
print("clock_time is {}".format(clock_time))
# 返回进程运行时间
process_time = time.process_time()
print("process_time is {}".format(process_time))
# 延迟执行时间,单位为秒;该函数无返回值
sleep_time = time.sleep(2)
print("sleep time is {}".format(sleep_time))
# 返回与UTC时间的时间差,以秒计算
alt_zone = time.altzone
print("alt_zone is {}".format(alt_zone))
# 返回时间格式为:Fri May 4 14:54:43 2018;如果传参,则转换参数;否则转换当前时间;参数为时间元组
asc_time = time.asctime()
print("asc_time is {}".format(asc_time))
# 返回时间格式为:Fri May 4 14:57:19 2018;如果传参,则转换参数;否则转换当前时间;参数为秒
c_time = time.ctime()
print("c_time is {}".format(c_time))
# 返回时间戳:将struct时间对象转成时间戳
mk_time = time.mktime(time.localtime())
print("mk_time is {}".format(mk_time))
# 返回字符串时间:将UTC struct_time格式转成指定的字符串格式时间
strf_time = time.strftime("%d: %m: %Y %H: %M: %S", time.gmtime())
print("strf_time is {}".format(strf_time))
# 返回struct_time时间:将字符串时间转成struct_time格式时间
strp_time = time.strptime("2018-05-04", "%Y-%m-%d")
print("strp_time is {}".format(strp_time))
相互之间的转换关系如下:
格式化参数说明:
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
%% A literal "%" character.
datetime模块介绍:
1.datetime模块包含如下类:
类名 | 功能说明 |
---|---|
date | 日期对象,常用的属性有year,month,day |
time | 时间对象 |
datetime | 日期时间对象,常用的属性有hour,minute,second,microsecond |
timedelta | 时间间隔,即两个时间点之间的长度 |
timezone | 时区 |
tzinfo | 时区信息对象 |
2.datetime模块中包含的常量
常量 | 功能说明 | 用法 | 返回值 |
---|---|---|---|
MAXYEAR | 返回能表示的最大年份 | datetime.MAXYEAR | 9999 |
MINYEAR | 返回能表示的最小年份 | datetime.MINYEAR | 1 |
3.时间加减
import datetime
print(datetime.datetime.now()) # 返回 2016-08-19 12:47:03.941925
print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19
print(datetime.datetime.now() )
print(datetime.datetime.now() + datetime.timedelta(3)) # 当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) # 当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) # 当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) # 当前时间+30分
c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2)) # 时间替换
如下简图所示(注:途中有个小错误,时间元组是7个元组):
2.random模块
1.random模块的基本方法:
import random
print(random.random()) # 随机生成[0, 1)之间的浮点数
print(random.randint(1, 10)) # 随机生成[a, b]范围的整数,包括端点
print(random.randrange(0, 100, 2)) # 随机生成[a, b)范围指定步长的数(2---偶数)
# random.choice:从非空序列中随机选择一个元素
print(random.choice("hello")) # 随机生成指定字符串中的元素
print(random.choice([1, 3, 5, 2, 4, 6])) # 随机生成指定列表中的元素
print(random.choice(("abc", "123", "liu", 555))) # 随机生成指定元组中的元素
print(random.sample("hello", 3)) # 随机生成指定序列的指定个数的元素
print(random.uniform(1, 10)) # 随机生成指定区间的浮点数
# 洗牌功能
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print("洗牌前:", items)
random.shuffle(items)
print("洗牌后:", items)
运行输出结果为:
0.4690573091913972
3
64
l
4
123
['l', 'h', 'l']
5.548564168880079
洗牌前: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
洗牌后: [8, 2, 9, 3, 6, 0, 4, 1, 7, 5]
2.random模块方法实际应用:生成随机验证码
(1)生成随机4位数字验证码
# 生成随机4位数字验证码
check_code = "" # 最终生成的验证码
for num in range(4):
current = random.randint(0, 9)
check_code += str(current)
print(check_code) # 运行输出结果为:7345
(2)生成随机4位字符串验证码(数字+字符)
# 生成随机4位字符串验证码(数字+字符)
check_code = "" # 最终生成的验证码
for i in range(4):
cur = random.randrange(0, 4) # 随机猜的范围
# 随机猜的范围与循环次数相等,取字母
if cur == i:
temp = chr(random.randint(65, 90)) # 随机取一个字母
else:
temp = random.randint(0, 9)
check_code += str(temp)
print(check_code) # 运行输出结果为:K666
3.os、sys和shutil模块
1.os模块提供了非常丰富的方法来处理文件和目录,常用的方法如下所示::
os.access(path, mode):检验权限模式
os.chdir(path):改变当前工作目录
os.chflags(path, flags):设置路径的标记为数字标记
os.chmod(path, mode):更改权限
os.chown(path, uid, gid):更改文件所有者
os.chroot(path):改变当前进程的根目录
os.close(fd):关闭文件描述符fd
os.closerange(fd_low, fd_high):关闭所有文件描述符,从fd_low(包含)刀fd_high(不包含),错误会忽略
os.dup(fd):复制文件描述符fd
os.dup2(fd, fd2):将一个文件描述符fd复制到另一个fd2
os.fchdir(fd):通过文件描述符改变当前工作目录
os.fchmod(fd, mode):改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限
os.fchown(fd, uid, gid):修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定
os.fdatasync(fd):强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息
os.fdopen(fd[, mode[, bufsize]]):通过文件描述符fd创建一个文件对象,并返回这个文件对象
os.fpathconf(fd, name):返回一个打开的文件的系统配置信息
os.fstat(fd):返回文件描述符fd的状态,像stat()
os.fstatvfs(fd):返回包含文件描述符fd的文件的文件系统的信息,像statvfs()
os.fsync(fd):强制将文件描述符为fd的文件写入硬盘
os.ftruncate(fd, length):裁剪文件描述符为fd对应的文件,所以它最大不能超过文件大小
os.getcwd():返回当前工作目录
os.getcwdu():返回当前工作目录的Unicode对象
os.isatty(fd):如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true,否则返回false
os.lchflags(path, flags):设置路径的标记为数字标记,类似chflags(),但是没有软连接
os.lchmod(path, mode):修改连接文件权限
os.lchown(path, uid, gid):更改文件所有者,类似chown,但是不追踪链接
os.link(src, dst):创建硬链接,名为参数dst,指向src
os.listdir(path):返回path指定的文件夹包含的文件或文件夹的名称列表
os.lseek(fd, pos, how):设置文件描述符fd当前位置pos,how修改方式:SEEK_SET或者0:从文件开始计算pos;SEEK_CUR或者1:从当前位置计算;SEEK_END或者2:从文件尾部开始;
os.lstat(path):像stat(),但是没有软连接
os.major(device):从原始的设备号中提取设备major号码(使用stat中的st_dev或者st_rdev field)
os.makedev(major, minor):以major和minor设备号组成一个原始设备号
os.makedirs(path[, mode]):递归文件夹创建函数,像mkdir(),但创建的所有intermediate-level文件夹需要包含子文件夹
os.minor(device):从原始设备号中提取设备minor号码(使用stat中的st_dev或者st_rdev field)
os.mkdir(path[, mode]):以数字mode的mode创建一个名为path的文件夹,默认的mode是0777(八进制)
os.mkfifo(path[, mode]):创建命名管道,mode为数字默认为0666(八进制)
os.mknod(filename[, mode=0600, device):创一个名为filename文件系统节点(文件,设备特别文件名或者命名pipe)
os.open(file, falgs[, mode]):打开一个文件,并且设置需要打开的选项,mode参数是可选的
os.openpty():打开一个新的伪终端对,返回pty和tty的文件描述符
os.pathconf(paht, name):返回相关文件的系统配置信息
os.pipe():创建一个管道,返回一对文件描述符(r, w)分别为读和写
os.popen(command[, mode[, bufsize]]):从一个command打开一个管道
os.read(fd, n):从文件描述符fd中读取最多n个字节,返回包含读取字节的字符串,文件描述符fd对应文件已到达结尾,返回空字符串
os.readlink(path):返回软连接所指向的文件
os.remove(path):删除路径为path的文件,如果是一个文件夹,将抛出OSError;查看下面的rmdir()删除一个directory
os.removedirs(path):递归删除目录
os.rename(src, dst):重命名文件或目录,从src到dst
os.renames(old, new):递归地对目录进行更名,也可对文件进行更名
os.rmdir(path):删除path指定的空目录,如果目录非空,则抛出OSErrot异常
os.stat(path):获取path指定的路径信息,功能等同于C API中的stat()系统调用
os.stat_float_times([newvalue]):决定stat_result是否以float对象显示时间戳
os.statvfs(path):获取指定路径的文件系统统计信息
os.symlink(src, dst):创建一个软连接
os.tcgetpgrp(fd):返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组
os.tcsetpgrp(fd, pg):设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg
os.tempnam([dir, [prefix]]):返回唯一的路径名用于创建临时文件
os.tmpfile():返回一个打开的模式为(w+b)的文件对象,该文件对象没有文件夹入口,没有文件描述符,将会自动删除
os.tmpnam():为创建一个临时文件返回一个唯一的路径
os.ttyname(fd):返回一个字符串,它表示与文件描述符fd关联的终端设备,如果fd没有与终端设备关联,则引发一个异常
os.unlink(path):删除文件路径
os.utime(path, times):返回指定的path文件的访问和修改的时间
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]):输出在文件夹中的文件名通过在树中游走,向上或向下
os.write(fd, str):写入字符串到文件描述符fd中,返回实际写入的字符串长度
2.sys模块常用函数:
sys模块常见函数:
sys.argv:实现从程序外部向程序传递参数,第一个元素是程序本身路径
sys.exit([arg]):程序中的推出,arg=0为正常退出
sys.getdefaultencoding():获取系统当前编码,一般默认为ASCII
sys.setdefaultencoding():设置系统默认编码,执行dir(sys)时不会看到这个方法,再解释器中执行不通过,
可以先执行reload(sys),再执行setdefaultencoding("utf-8"),此时将系统默认编码设置为utf-8
sys.getfilesystemencoding():获取文件系统使用编码方式
sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到
sys.platform:获取当前系统平台
sys.version:获取python解释器版本信息
sys.stdin,sys.stdout,sys.stderr:标准I/O流对应的对象
3.shutil模块:
shutil:高级的文件、文件夹、压缩包处理模块
shutil.copyfileobj(fsrc, fdst[, length]):将文件内容拷贝到另一个文件中,copyfileobj方法只会拷贝文件内容
shutil.copyfile(src, dst):拷贝文件,copyfile只拷贝文件内容
shutil.copy(src, dst):拷贝文件和权限
shutil.copy2(src, dst):拷贝文件和状态信息
shutil.copymode(src, dst):仅拷贝权限,内容、组、用户均不变,前提是dst文件存在,否则产生异常
shutil.copystat(src, dst):仅拷贝状态信息,即文件属性,包括:mode bits、atime、mtime、flags
shutil.ignore_patterns(*patterns):忽略某个文件,有选择性的拷贝
shutil.copytree(src, dst, symlinks=Flase, ignore=None):递归的去拷贝文件
shutil.rmtree(path[, ignore_errors[, onerror]]):递归的删除文件
shutil.move(src, dst):递归的移动文件,类似mv命令,其实就是重命名
shutil.make_archive(base_name, format, ...):
创建压缩包并返回文件路径,例如:zip、tar
base_name:压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径
如:www=>保存至当前路径 如:/Users/alex/www => 保存至/Users/alex
format:压缩包种类,"zip","tar","bztar","gztar"
root_dir:要压缩的文件夹路径(默认当前目录)
owner:用户,默认当前用户
group:组,默认当前组
logger:用于记录日志,通常时logging.Logger对象
import shutil
# 将 C:Downloads est 下的文件打包放置当前程序目录
res1 = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='C:\Downloads\test')
# 将 C:Downloads est 下的文件打包放置 Usersmydir目录(当前目录)
res2 = shutil.make_archive("/Users/mydir/wwwwwwwwww", 'gztar', root_dir='C:\Downloads\test')
在Python的底层,shutil对压缩包的处理是调用ZipFile和TarFile两个模块来进行处理的,详解:
import zipfile
# 压缩
z_file = zipfile.ZipFile("test.zip", "w")
z_file = write("a.log")
z_file = write("data.date")
z_file.close()
# 解压
z_unfile = zipfile.ZipFile("test.zip", "r")
z_unfile.extractall()
z_unfile.close()
import tarfile
# 压缩
tar_in = tarfile.open("my.tar", "w")
tar_in.add("C:\Users\bbs.log", arcname="bbs.log")
tar_in.add("C:\Users\cmdb.log", arcname="cmdb.log")
tar_in.close()
# 解压
tar_out = tarfile.open("my.tar", "r")
tar_out.extractall() #可设置解压地址
tar_out.close()