欢迎来到十九分快乐的博客

生死看淡,不服就干。

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)   #添加文件
posted @ 2020-12-10 23:10  十九分快乐  阅读(79)  评论(0编辑  收藏  举报