• 处理文件、文件夹、压缩包(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)
    
  • 相关阅读:
    为什么今日头条是技术牛人收割机(FW)
    独家|浅谈用户行为数据的价值挖掘(PPT)(FW)
    深度学习笔记
    "堕落"的头条,还是"不堪"的民众?
    理解传统企业的问题与困惑
    人工智能在医疗领域究竟要怎么玩?(FW)
    佟崴嵬
    youtube true view的逻辑
    AI第一性原理
    域对象的属性和请求的转发重定向
  • 原文地址:https://www.cnblogs.com/qpzm/p/6072135.html
Copyright © 2020-2023  润新知