zoukankan      html  css  js  c++  java
  • 处理文件、文件夹、压缩包(zipfile模块、tarfile模块) 系统命令处理--shutil模块 subprocess模块

    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*'))
    
    # 忽略.pyc文件和tmp开头的文件
    

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

    import shutil
     
    shutil.rmtree('folder1')
    

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

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

    处理压缩包

    zipfile模块

    import zipfile
    
    # 压缩
    z = zipfile.ZipFile('laxi.zip', 'w')  # 支持以a方式打开,压缩包中追加文件
    z.write('a.log')
    z.write('data.data')
    z.close()
    
    # 解压
    z = zipfile.ZipFile('laxi.zip', 'r')
    z.extractall()  # 解压所有文件
    z.namelist()  # 压缩文件中的文件名,字符串
    z.extract("xxx.txt")  # 解压单独文件
    z.close()
    

    tarfile模块

    import tarfile
    
    # 压缩
    tar = tarfile.open('your.tar','w')  # 同时也支持a模式
    tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')  # 压缩进压缩文件,改名arcname
    tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
    tar.close()
    
    # 解压
    tar = tarfile.open('your.tar','r')
    tar.extractall()  # 可设置解压地址
    tar.getmembers()  # 获得成员,对象
    tar.getmember("xxx.txt")  # 对象名
    tar.extract(tar.getmember("xxx.txt"))  # 解压单个文件
    tar.close()
    

    subprocess模块

    执行系统命令
    **call **
    执行命令,返回状态码

    ret = subprocess.call(["ls", "-l"], shell=False)
    ret = subprocess.call("ls -l", shell=True)
    

    check_call
    执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

    subprocess.check_call(["ls", "-l"])
    subprocess.check_call("exit 1", shell=True)
    

    check_output
    执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

    subprocess.check_output(["echo", "Hello World!"])
    subprocess.check_output("exit 1", shell=True)
    

    subprocess.Popen(...)
    用于执行复杂的系统命令
    相当于 call check_call check_output的底层结构代码
    参数:

    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
      所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    • shell:同上
    • cwd:用于设置子进程的当前目录
    • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    • universal_newlines:不同系统的换行符不同,True -> 同意使用
    • startupinfo与createionflags只在windows下有效
      将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
    import subprocess
    
    obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)  # 跳转到cwd所指目录,在此目录执行命令
    

    例子:

    import subprocess  # 只能三个管道 “写入 读取 错误”
    
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    obj.stdin.write("print(1)
    ")  # 写东西管道
    obj.stdin.write("print(2)")
    obj.stdin.close()
    
    cmd_out = obj.stdout.read()  # 读取管道
    obj.stdout.close()
    cmd_error = obj.stderr.read()  # 错误管道
    obj.stderr.close()
    
    print(cmd_out)
    print(cmd_error)
    

    上面代码等同于:

    import subprocess
    
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    obj.stdin.write("print(1)
    ")
    obj.stdin.write("print(2)")
    
    out_error_list = obj.communicate()  # 等同于输出(读取)和错误管道合并
    print(out_error_list)  # 返回一个列表
    

    再次等同于:

    import subprocess
    
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    out_error_list = obj.communicate('print("hello")')  # 适用于简单命令
    print(out_error_list)
    
  • 相关阅读:
    AtCoder Beginner Contest 205
    Codeforces Round #725 (Div. 3)
    Educational Codeforces Round 110 (Rated for Div. 2)【A
    Codeforces Round #722 (Div. 2)
    AtCoder Beginner Contest 203(Sponsored by Panasonic)
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)
    PTA 520 钻石争霸赛 2021
    Educational Codeforces Round 109 (Rated for Div. 2)【ABCD】
    AtCoder Beginner Contest 200 E
    Educational Codeforces Round 108 (Rated for Div. 2)【ABCD】
  • 原文地址:https://www.cnblogs.com/qpzm/p/6072135.html
Copyright © 2011-2022 走看看