zoukankan      html  css  js  c++  java
  • day19:os模块&shutil模块&tarfile模块

    os模块:对系统进行操作(6+3)

    system  popen  listdir  getcwd  chdir  environ / name  sep  linesep

    import os
    
    #### os模块方法 ####
    
    # 1.system 在python中执行系统命令
    os.system("ifconfig")
    os.system("touch 1.txt")
    
    # 2.popen 执行系统命令返回对象
    # 可以通过read方法读出字符串,防止字符串乱码,使用popen进行操作
    obj = os.popen("ifconfig")
    res = obj.read()
    print(res)
    
    # 3.listdir 获取指定文件夹中的所有内容的名称列表
    lst = os.listdir(".") # . 当前目录
    lst = os.listdir("..") # . 上一级目录
    lst = os.listdir("/home/libolun")
    print(lst)
    
    # 4.getcwd 获取当前文件所在的默认路径(单纯的路径)
    res = os.getcwd()
    print(res) # /mnt/hgfs/python31_gx/day19
    # 路径+文件
    print(__file__) # /mnt/hgfs/python31_gx/day19/1.py
    
    # 5.chdir 修改当前文件工作的默认路径
    os.chdir("/home/libolun/mywork")
    os.system("mkdir ceshi100")
    
    # 6.environ 获取或修改环境变量
    print(os.environ) # 获取所有环境变量
    print(os.environ["path"])
    os.environ["path"] += ":/home/libolun/mywork" # 修改环境变量
    os.system("libolun")
    
    #### os模块属性 ####
    
    # 1.name 获取系统标识
    # linux,mac->posix   windows->nt
    print(os.name)
    
    # 2.sep 获取路径分割符号
    # linux,mac-> /   windows-> 
    print(os.sep)
    
    # 3.linesep 获取系统的换行符号
    # linux,max-> 
       windows->
    或
    
    print(repr(os.linesep))

    os模块:新建和删除(7)

    mknod  remove  mkdir  rmdir  rename  makedirs  removedirs

    #### os 负责新建和删除 ####
    
    # 1 os.mknod 创建文件
    os.mknod("1.txt")
    
    # 2.os.remove 删除文件
    os.remove("1.txt")
    
    # 3.os.mkdir 创建文件夹
    os.mkdir("ceshi100")
    
    # 4.os.rmdir 删除文件夹
    os.rmdir("ceshi100")
    
    # 5.os.rename 对文件/文件夹重命名
    os.rename("111.txt","123.py")
    
    # 6.os.makedirs 递归创建文件夹
    os.makedirs("a/b/c/d/e")
    
    # 7.os.removedirs 递归删除文件夹(空文件夹)
    os.removedirs("a/b/c/d/e")

    shutil:负责复制和移动(6+2+1)

    copyfileobj  copyfile  copymode  copystat  copy  copy2  copytree  rmtree  remove

    # 1.copyfileobj(fsrc,fdst,[,length=16*1024]) 单纯复制文件的内容
    # 需要手动创建文件对象
    fp1 = open("123.py",mode='r',encoding="utf-8")
    fp2 = open("lianxi111.php",mode="w",encoding="utf-8")
    shutil.copyfileobj(fp1,fp2)
    
    # 2.copyfile(src,dst) 单纯的仅复制文件内容
    # 在底层调用了copyfileobj
    shutil.copyfile("1.php","2.js")
    
    # 3.copymode(src,dst) 单纯的复制权限,不包括文件内容
    shutil.copymode("1.php","2.js")
    
    # 4.copystat(src,dst) 复制文件所有状态信息,不包括内容
    # 状态信息:包括权限、组、用户、修改时间
    shutil.copystat("1.py","2.php")
    
    # 5.copy(src,dst) 复制文件的权限和内容
    shutil.copy("1.py","2.html")
    
    # 6.copy2(src,dst) 复制文件权限和内容,还有组,时间,用户等
    shutil.copy2("1.py","2.html")
    
    # 7.copytree(src,dst) 复制文件夹里的所有内容(递归拷贝)
    shutil.copytree("lianxi001","lianxi002")
    
    # 8.rmtree(path) 删除当前文件夹以及文件夹中的所有内容(递归删除)
    shutil.rmtree("lianxi001")
    
    # 9.move(path1,path2) 移动文件或者文件夹
    shutil.move("1.php","..")
    shutil.move("lianxi001","../lianxi007") # 移动并改名

    os.path:路径模块(6+3+3+3)

    basename  dirname  split  join  splitext  getsize  isdir  isfile  islink  getctime  getatime  getmtime  exists  isabs  abspath

    # 1.basename 返回文件名部分
    strvar = "/home/libolun/mywork/1.py"
    res = os.path.basename(strvar)
    print(res) # 1.py
    
    # 2.dirname 返回路径部分
    res = os.path.dirname(strvar)
    print(res) # /home/libolun/mywork
    
    # 3.split 将路径拆分为单独的文件部分和路径部分,并组合成一个元组
    tup = os.path.split(strvar)
    print(tup)
    
    # 4.join 将多个路径和文件组成新的路径
    # 可以自动通过不同的系统加不同的斜杠
    path1 = "ceshi1"
    path2 = "libolun"
    path3 = "2.py"
    # pathvar = path1 + os.sep + path2 + os.sep + path3
    pathvar = os.path.join(path1,path2,path3)
    print(pathvar)
    
    # 5.splitext 将路径分割为后缀和其他部分
    res = os.path.splitext(strvar)
    print(res) # ('/home/libolun/mywork/1','.py')
    
    
    # 6.getsize 获取文件的大小
    res = os.path.getsize("1.py")
    # 文件夹不能计算
    res = os.path.getsize("os")
    print(res)
    
    # 7.isdir 检测路径是否是一个文件夹
    strvar = "/home/libolun/mywork/libolun"
    res = os.path.isdir(strvar)
    print(res)
    
    # 8.isfile 检测路径是否是一个文件
    strvar = "/home/libolun/mywork/libolun"
    res = os.path.isfile(strvar)
    print(res)
    
    # 9.islink 检测路径是否是一个链接
    strvar = "/home/libolun/mywork/libolun"
    res = os.path.islink(strvar)
    print(res)
    
    # 10.getctime [windows]文件的创建时间 [linux]权限的改动时间
    # 返回的是时间戳
    res = os.path.getctime("1.py")
    
    # 11.getmtime 获取文件最后一次修改时间
    res = os.path.getmtime("1.py")
    
    # 12.getatime 获取文件最后一次访问时间
    res = os.path.getatime("1.py")
    
    # 13.exists 检测指定的路径是否存在
    strvar = "/home/libolun/mywork/libolun"
    res = os.path.exists(strvar)
    print(res)
    
    # 14.isabs 检测一个路径是否是绝对路径
    pathvar = "."
    res = os.path.isabs(pathvar)
    print(res)
    
    # 15.abspath 将相对路径转化为绝对路径
    pathnew = os.path.abspath(pathvar)
    print(pathnew)
    
    # 检测是否是绝对路径,如果不是,将其转化为绝对路径
    if not os.path.abspath(pathvar):
        pathnew = os.path.abspath(pathvar)
        print(pathnew)

    tarfile:压缩模块(4)

    压缩 解压 追加 查看

    # 1.创建tar包
    '''最小的压缩包,后缀格式为bz2'''
    # 单纯的tar包
    tf = tarfile.open("ceshi001.tar",'w',encoding="utf-8")
    tf.add("bin/echo","echo")
    tf.add("bin/ed","ed")
    tf.add("bin/fuser","/tmp/fuser")
    tf.close()
    
    tf = tarfile.open("ceshi002.tar.gz",'w:gz',encoding="utf-8")
    tf.add("bin/echo","echo")
    tf.add("bin/ed","ed")
    tf.add("bin/fuser","/tmp/fuser")
    tf.close()
    
    tf = tarfile.open("ceshi003.tar.bz2",'w:bz2',encoding="utf-8")
    tf.add("bin/echo","echo")
    tf.add("bin/ed","ed")
    tf.add("bin/fuser","/tmp/fuser")
    tf.close()
    
    # 2.对压缩包进行解压
    tf = tarfile.open("ceshi003.tar.bz2",'r',encoding="utf-8")
    # 解压单个
    tf.extract("echo","ceshi004")
    # 解压所有
    tf.extractall("ceshi005")
    
    # 3.追加文件
    # 支持with语法
    # 只能为没有压缩过的tar包进行追加
    with tarfile.open("ceshi001.tar",'a',encoding="utf-8") as tf:
        tf.add("/bin/cp","cp")
    
    # 4.查看压缩包中的文件
    with tarfile.open("ceshi002.tar.gz",'a',encoding="utf-8") as tf:
        lst = tf.getnames()
        print(lst)

    思考题:计算一个文件夹的大小

    import os
    
    pathvar = "/mnt/hgfs/python31_gx/day19/ceshi100"
    
    # 递归计算文件夹的大小
    def getallsize(pathvar):
        size = 0
        # 获取当前文件夹中所有内容
        lst = os.listdir(pathvar)
        # 循环列表
        for i in lst:
            # 拼接完整路径
            pathnew = os.path.join(pathvar,i)
            # 判断是否是文件或者文件夹
            if os.path.isfile(pathnew):
                size += os.path.getsize(pathnew)
            elif os.path.isdir(pathnew):
                # 如果是文件夹,继续调用函数.
                size += getallsize(pathnew)
        # 返回最后的结果
        return size
    
    res = getallsize(pathvar)
    print(res) 

    思考题:如何处理tarfile不能再已经压缩过的保重追加内容的问题

    import os
    path = os.getcwd()
    # 找到要解压的包的路径
    pathvar1 = os.path.join(path,"ceshi0729_3.tar.bz2")
    # 解压到哪里去
    pathvar2 =  os.path.join(path,"ceshi0729_3")
    
    # (1) 先对已经压缩过的包进行解压
    with tarfile.open(pathvar1,"r",encoding="utf-8") as tf:
        tf.extractall(pathvar2)
    
    # (2) 往这个解压的文件夹中添加新的文件
    mybin = "cp -a /bin/fgrep " + pathvar2
    # print(mybin) # cp -a /bin/fgrep /mnt/hgfs/python31_gx/day19/ceshi0729_3
    os.system(mybin)
    
    
    # (3) 对这个文件进行过滤筛选,重新打包压缩 (不要echo)
    lst = os.listdir(pathvar2)
    with tarfile.open(pathvar1,"w:bz2",encoding="utf-8") as tf:
        for i in lst:
            if i != "echo":
                # 拼接完整路径
                pathnew = os.path.join(pathvar2,i)
                # add(路径,别名)
                tf.add(pathnew,i)
  • 相关阅读:
    POJ-1502-MPI Maelstrom
    POJ-3259-Wormholes
    【BZOJ4399】—膜法少女LJJ(线段树合并)
    省选模板复习—【计算几何】
    【BZOJ2115】【WC2011】—Xor(线性基)
    【洛谷P5290】【十二省联考2019】春节十二响(贪心+启发式合并)
    【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)
    【LOJ#3043】【洛谷P5280】【ZJOI2019】—线段树(计数dp+线段树)
    【省选模拟】—猎人杀(概率dp)
    【BZOJ4828】【HNOI2017】—大佬(LmyAKIOI!)
  • 原文地址:https://www.cnblogs.com/libolun/p/13399772.html
Copyright © 2011-2022 走看看