16.os模块-shutil模块-tarfile压缩模块
目录
os模块-shutil模块-tarfile压缩模块
1.os模块
1.1 os模块属性
###---os 模块属性
import os
# 1.name 获取系统标识 Linux和Mac : posix , Windows : nt
print(os.name)
# 2.sep 获取系统路径分隔符号 Linux和Mac : / , Windows : \
print(os.sep)
# 3.linesep 获取系统换行符号 Linux和Mac : \n , Windows : \t\n 或 \n
print(os.linesep)
1.2 os模块对系统的操作
# os模块对系统的操作
import os
# 1.system() 在python中执行系统命令
os.system("mkdir jyh")
# 2.popen() 执行系统命令返回对象,通过read方法读取字符串
obj=os.popen("ifconfig")
res=obj.read()
print(res)
# 3.listdir() 获取指定文件夹中所有内容的名称列表(只能查看一个层级)
lst=os.listdir(".") #获取当前目录
lst=os.listdir("/etc")
print(lst)
# 4.getcwd() 获取当前文件所在的默认路径
"""__file__ : 获取当前文件所在的默认路径+文件名"""
print(os.getcwd())
print(__file__)
# 5.chdir 修改当前文件工作的默认路径
os.chdir("/home/jyh")
os.system("touch 1.txt") #会在/home/jyh目录下创建文件
os.system("rm -rf 1.txt")
# 6.environ 获取或修改环境变量
"""
环境变量PATH : 当系统执行命令时,默认会按照环境变量中的路径查找可执行文件,找不到报错
Windows : 环境变量修改
1.右键qq找路径 -> 右键电脑属性 ->高级系统设置 -> 环境变量 -> 找path环境变量进行修改
2.打开cmd -> 执行qq
Linux :
1.在家目录创建一个jia文件,里边写一些命令
2.给予可执行权限:chmod 777 jia
3.追加jia所在的路径到Linux环境变量中:os.environ["PATH"] +=" : 路径"
4.执行命令jia :os.system("jia")
"""
path=os.environ["PATH"]
print(path)
1.3 os模块对文件的操作(创建,删除,重命名)
import os
# 1.mknod 创建文件
# 2.remove 删除文件
os.mknod("aa.aa")
os.remove("aa.aa")
# 3.mkdir 创建目录
# 4.rmdir 删除目录
os.mkdir("qqq")
os.rmdir("qqq")
# 5.makedirs 递归创建空文件夹
# 6.removedirs 递归删除空文件夹(怎么创建怎么删除)
os.makedirs("a/s/d/f/g")
os.removedirs("a/s/d/f/g")
# 7.rename 对文件或目录重命名
os.rename("bb","aa")
# 8.walk 遍历文件夹
path_buf_tps_img = os.path.join(os.getcwd(),'buf_tps_img')
if os.path.exists(path_buf_tps_img):
# 遍历文件夹 root当前文件夹路径 dirs文件夹下目录 files文件夹下文件
for root, dirs, files in os.walk(path_buf_tps_img):
for i in files:
print(os.path.join(root,i)) # 拼接文件路径
1.4 shutil 模块对文件的操作(复制,移动)
import shutil
# 1.复制内容
# copyfileobj(fsrc,fdst,length=16*1024)复制文件 (length的单位是字符(表达一次读多少字符)) (了解)
# copyfile(src,dst) 仅复制内容,底层调用了copyfileobj
fp1 = open("1.txt",mode="r",encoding="utf-8")
fp2 = open("2.txt",mode="w",encoding="utf-8")
shutil.copyfileobj(fp1,fp2)
shutil.copyfile("1.txt","11.txt")
# 2.复制权限
# copymode(src,dst) 仅复制权限,不复制内容
# copystat(src,dst) 复制所有状态信息,包括权限,组,用户,修改时间等;不复制内容
"""复制文件时,文件必须存在"""
shutil.copymode("1.txt","2.txt")
shutil.copystat("1.txt","2.txt")
# 3.复制权限+内容
# copy(src,dst) 复制文件权限和内容
# copy2(src,dst) 复制文件所有状态信息和内容
shutil.copy2("1.txt","4.txt")
shutil.copy("1.txt","3.txt")
# 4.递归拷贝与删除
# copytree(src,dst) 拷贝文件夹里面所有内容(递归拷贝)
# rmtree() 删除当前文件夹及其所有内容(递归删除)
shutil.copytree("111","222")
shutil.rmtree("222")
# 5.move 移动文件或目录(可改名)
shutil.move("bb","/home/jyh/")
shutil.move("bb","/home/jyh/11") #移动改名为11
1.5 os的路径模块: os.path
# os路径模块:os.path
import os,time
# 1.dirname 返回路径(文件夹)部分
# 2.basename 返回文件名部分
# 3.split 将路径拆分成路径部分和文件部分,组成一个元组
# 4.splitext 将路径分割为其他部分和后缀部分,组成一个元组(了解)
pathvar="/home/jia/1.txt"
res=os.path.basename(pathvar)
print(res) # 1.txt
res=os.path.dirname(pathvar)
print(res) # /home/jia
tup=os.path.split(pathvar)
print(tup) # ('/home/jia', '1.txt')
tup=os.path.splitext(pathvar)
print(tup) # ('/home/jia/1', '.txt')
# 5.join 将多个路径和文件组成新的路径,可以自动识别系统路径符号
path1="home"
path2="jiayyinghe"
path3="11.txt"
pathvar=os.path.join(path1,path2,path3)
print(pathvar) # home/jiayyinghe/11.txt
# 6.getsize 获取文件的大小(字节)
"""getsize 只能获取文件大小,不能获取文件夹的大小"""
pathvar=os.path.join(os.getcwd(),"1.txt") #文件绝对路径
res=os.path.getsize(pathvar)
print(res)
# 7.isdir 检测路径是否是文件夹
# 8.isfile 检测路径是否是文件
# 9.islink 检测路径是否是连接
pathvar=os.path.join(os.getcwd(),"1.txt") #获取绝对路径
res=os.path.isdir(pathvar)
print(res)
res=os.path.isfile(pathvar)
print(res)
res=os.path.islink(pathvar)
print(res)
# 10.getctime 获取Windows文件的创建时间,Linux权限改动时间(返回时间戳) creation->创建
# 11.getmtime 获取文件最后一次修改时间(返回时间戳) modification->修改
# 12.getatime 获取文件最后一次访问时间(返回时间戳) access->访问
res=os.path.getctime("3.txt")
print(time.ctime(res)) #时间字符串
res=os.path.getmtime("3.txt")
print(time.ctime(res))
res=os.path.getatime("3.txt")
print(time.ctime(res))
# 13.exists 检测指定路径是否存在
# 14.isabs 检测一个路径是否为绝对路径
# 15.abspath 将相对路径转化为绝对路径
pathvar="3.txt"
res=os.path.exists(pathvar)
print(res)
res=os.path.isabs(pathvar)
print(res)
res=os.path.abspath(pathvar)
print(res) #/mnt/hgfs/Ubuntu共享文件夹/贾英贺1210/3.txt
# 练习:计算一个文件夹的大小,无限层级
"""需要使用递归函数"""
def func(path):
size=0
lst=os.listdir(path) #获取文件里的名称列表
for i in lst:
pathvar=os.path.join(path,i) #拼接路径
if os.path.isdir(pathvar): #判断是否为目录
size += func(pathvar)
elif os.path.isfile(pathvar):#判断是否为文件
size += os.path.getsize(pathvar)
return size
pathvar=os.path.join(os.getcwd(),"111") #获取文件的绝对路径
res=func(pathvar) #调用函数
print(res)
2.tarfile 压缩模块 后缀为.tar 或 .tar.gz或 .tar.bz2
import tarfile
"""
模式:
w ->单纯的套一个后缀,打包不压缩
w:bz2 ->采用bz2算法压缩,(理论上压缩后更小)
w:gz ->采用gz算法
"""
# 1.创建压缩文件 (同样适用with...as 语法)
"""
1.open('路径包名','模式','字符编码') 创建或者打开文件
2.add(路径文件,"别名") 向压缩文件中添加文件
3.close() 关闭文件
"""
#创建.tar压缩包
tf=tarfile.open("a.tar","w",encoding="utf-8")
tf.add("1.txt") #别名可不写
tf.close()
#创建.tar.gz压缩包
with tarfile.open("a.tar.gz","w:gz",encoding="utf-8")as tf:
tf.add("1.txt","11")
#创建.tar.bz2压缩包
with tarfile.open("a.tar.bz2","w:bz2",encoding="utf-8")as tf:
tf.add("1.txt","22")
# 2.解压文件
"""
1.open('路径包名','模式','字符编码') 读r模式打开文件
2.extractall(路径) 解压所有文件到某个路径下
extract(文件,路径) 解压指定的某个文件到某个路径下
3.close() 关闭压缩文件
"""
with tarfile.open("a.tar.gz","r",encoding="utf-8")as tf:
tf.extractall("666")
# 3.查看压缩文件 getnames() 返回列表
with tarfile.open("a.tar.bz2","r",encoding="utf-8")as tf:
res=tf.getnames()
print(res)
# 4.追加文件
"""
无法对已经压缩过的压缩包进行追加,只能追加.tar压缩包
"""
with tarfile.open("a.tar","a",encoding="utf-8")as tf:
tf.add("2.txt")
# 解决办法:
"""
1.先解压到指定文件夹
2.把文件复制移动到该文件夹
3.再重新过滤解压
"""
import shutil,os
# 1.先解压到指定文件夹
with tarfile.open("a.tar.gz","r",encoding="utf-8")as tf:
tf.extractall("999")
# 2.把文件复制移动到该文件夹
path2=os.path.join(os.getcwd(),"999") #拼接绝对路径
shutil.copy("3.txt",path2)
# 3.再重新过滤解压
with tarfile.open("a.tar.gz","w:gz",encoding="utf-8")as tf:
for i in os.listdir(path2): #文件名称列表遍历
pathvar=os.path.join(path2,i) #拼接绝对路径
tf.add(pathvar,i) #添加文件