zoukankan      html  css  js  c++  java
  • 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 : 
     , Windows : 	
     或 
    
    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)   #添加文件
    
  • 相关阅读:
    BZOJ4779: [Usaco2017 Open]Bovine Genomics
    USACO比赛题泛刷
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    LOJ #10132. 「一本通 4.4 例 3」异象石
    $O(n+log(mod))$求乘法逆元的方法
    BZOJ2226: [Spoj 5971] LCMSum
    数据库 | Redis 缓存雪崩解决方案
    中间件 | 微服务架构
    数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍
    数据库 | SQL语法优化方法及实例详解
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14118046.html
Copyright © 2011-2022 走看看