模块、包及常用模块(time/random/os/sys/shutil)

时间:2023-03-08 17:50:44
模块、包及常用模块(time/random/os/sys/shutil)

一、模块

模块的本质就是一个.py 文件。

导入和调用模块:

import module

from module import xx

from module.xx.xx import xx as rename  

from module.xx.xx import *

模块调用时发生了三件事:

import 
1.创建名称空间
2.执行模块文件
3.在执行文件中创建一个名称 指向模块的名称空间
from
1.创建名称空间
2.执行模块文件
3.把模块中的名称复制到当前名称空间

注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码

python中有三种模块:
1. 内置模块(内置于解释器中,不用导入,直接调用)
2. 第三方模块(在lib目录下,导入后可以调用)
3. 自定义模块(默认从当前工作目录下导入,导入后可以调用)
python解释器对于模块的查找也是遵循上面的顺序。python模块丰富,后期涉及到的网络编程和线程进程,基本就是在学socket 和threading processing 这两个模块

相对导入和绝对导入

绝对导入的定义

从sys.path开始的完整路径称之为绝对导入
我们会发现
1.如果你的包的层级比较复杂 写起来很长
2.假如有一天 你需要修改包名 你需要将所有导入语句全改一遍
为了解决这两个问题 我们最好使用相对导入

相对导入的定义

相对于被导入模块的路径
语法 .表示当前目录 ..当前往上一级目录 ...上上级 以此类推
注意:建议不要超过三层
相对导入只能用于 包的内部模块之间相互导入

二、包

包也是一种模块

对于使用者而言 使用方式和模块没有任何区别

本质上就是一个文件夹 不同之处在于 多了一个__init__.py 叫包的初始化文件。

在导入包的时候 由于包实际上是一个文件夹 不能被执行 所以包中需要提供__init__.py文件

该文件用于代表这个包

所以上面import pack 实际上时执行了pack下的__init___.py 导入了这个名称

那么问题来了,__init__.py 的作用是什么?

__init__.py文件的作用? ******
说白了就是导入该包下的所有模块 这样一来使用包的人 用起来非常简单 无需关心包中的文件结构
只要导入了包 就能使用包中的所有功能
__init__.py 应该包含什么内容?
不应该包含任何的业务逻辑 仅仅用于导入包中的模块

导入语法:

pack.sayhello()
pack.m1.sayhi()
pack.sayhi()
pack.pack.m1

三、常用模块汇总

Time & Datetime 模块

Time模块:

三种表示方式:

1、时间戳

2、格式化的时间字符串

3、元组(struct_time)共九个元素。

三种形式之间的转换:

结构化>>>时间戳:
time.mktime(time.localtime())
时间戳>>>结构化:
time.localtime() 默认传入当前时间戳。

结构化>>>字符串:
time.strftime('%Y-%m-%d, time.localtime())
字符串>>>结构化:
time.strptime('2016-06-21', '%Y-%m-%d')

模块、包及常用模块(time/random/os/sys/shutil)

另外两外两种转化字符串时间的方法: (老外习惯用的时间表示法)

time.asctime() 默认把当前结构时间转化为字符串

time.ctime() 默认把当前时间戳转化为字符串

time.sleep() 睡眠。其实是一种I/O阻塞(类似的,input也是一种I/O阻塞,阻塞时,CPU会被调度到其它任务,因此不占CPU的)

Datetime模块

#时间加减
import datetime # print(datetime.datetime.now()) #返回 -- ::03.941925
#print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 如2018--
# print(datetime.datetime.now() )
# print(datetime.datetime.now() + datetime.timedelta()) #当前时间+3天
# print(datetime.datetime.now() + datetime.timedelta(-)) #当前时间-3天
# print(datetime.datetime.now() + datetime.timedelta(hours=)) #当前时间+3小时
# print(datetime.datetime.now() + datetime.timedelta(minutes=)) #当前时间+30分 # c_time = datetime.datetime.now()
# print(c_time.replace(minute=,hour=)) #时间替换

Random模块(生成随机字符串)

比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串随机数生成的模块

常用的语法操作如下:

>>> random.randrange(,) #返回1-10之间的一个随机数,不包括10
>>> random.randint(,) #返回1-10之间的一个随机数,包括10 >>> random.randrange(, , ) #随机选取0到100间的偶数 >>> random.random() #返回一个随机浮点数
>>> random.choice('abce3#$@1') #返回一个给定数据集合中的随机字符 >>> random.sample('abcdefghij',) #从多个字符中选取特定数量的字符
['a', 'd', 'b'] #洗牌
>>> a
[, , , , , , , , , ]
>>> random.shuffle(a)
>>> a
[, , , , , , , , , ]

小练习:

生成随机字符串

>>> import string
>>> ''.join(random.sample(string.ascii_lowercase + string.digits, ))
'4fvda1'

sys模块(解释器相关信息的模块)

sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit()
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:') #标准输出 , 引出进度条的例子, 注,在py3上不行,可以用print代替
val = sys.stdin.readline()[:-] #标准输入
sys.getrecursionlimit() #获取最大递归层数
sys.setrecursionlimit() #设置最大递归层数
sys.getdefaultencoding() #获取解释器默认编码
sys.getfilesystemencoding #获取内存数据存到文件里的默认编码

os模块(与操作系统相关、对文件的处理、对路径的处理)

常用语法操作:

不带path:

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 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量 带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路径处理
#方式一:推荐使用
import os
#具体应用
import os,sys
possible_topdir = os.path.normpath(os.path.join(
os.path.abspath(__file__),
os.pardir, #上一级
os.pardir,
os.pardir
))
sys.path.insert(,possible_topdir) #方式二:不推荐使用
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

shutil模块(用于操作文件、包括压缩和解压)

shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中

import shutil
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

shutil.copyfile(src, dst)
拷贝文件

shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在

shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变

shutil.copymode('f1.log', 'f2.log') #目标文件必须存在

shutil.copystat(src, dst)
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

shutil.copystat('f1.log', 'f2.log') #目标文件必须存在

shutil.copy(src, dst)
拷贝文件和权限

import shutil
shutil.copy('f1.log', 'f2.log')

shutil.copy2(src, dst)
拷贝文件和状态信息

import shutil
shutil.copy2('f1.log', 'f2.log')

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹

import shutil
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除

shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件

import shutil
shutil.rmtree('folder1')

shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。


import shutil
shutil.move('folder1', 'folder3')

shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
创建压缩包并返回文件路径,例如:zip、tar

base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

如 data_bak =>保存至当前路径
如:/tmp/data_bak =>保存至/tmp/

format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”

root_dir: 要压缩的文件夹路径(默认当前目录)

owner: 用户,默认当前用户

group: 组,默认当前组

logger: 用于记录日志,通常是logging.Logger对象

#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data') #将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data') 若想放在指定目录,在文件前加上指定目录的位置即可。

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:

zipfile压缩&解压缩


import zipfile

# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()
# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall(path='.')
z.close()

tarfile压缩&解压缩


import tarfile

# 压缩
>>> t=tarfile.open('/tmp/egon.tar','w')
>>> t.add('/test1/a.py',arcname='a.bak')
>>> t.add('/test1/b.py',arcname='b.bak')
>>> t.close()

# 解压
>>> t=tarfile.open('/tmp/egon.tar','r')
>>> t.extractall('/egon')
>>> t.close()