Python模块(三)

subprocess模块

subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* commands.*
subprocess最简单的用法就是调用shell命令了,另外也可以调用程序,并且可以通过stdout,stdin和stderr进行交互。

import subprocess

# 执行命令,获取结果
ret = subprocess.check_output('dir',shell=True,cwd=r'D:\dir')


# 执行命令,但不获取结果
subprocess.check_call('dir',shell=True,cwd=r'D:\dir')

更多使用方法自行问百度

shutil模块

shutil 模块 非常简便的文件操作 压缩包处理模块

import shutil

# 将文件内容拷贝到另一个文件中
shutil.copyfileobj(open('a', 'r'), open('b', 'w'))

#拷贝文件
shutil.copyfile('1.txt', '2.txt')  # 目标文件无需存在

#仅拷贝权限。内容、组、用户均不变
shutil.copymode('f1.log', 'f2.log')  # 目标文件必须存在

#仅拷贝状态的信息,包括:mode bits,atime,mtime,flags
shutil.copystat('f1.log', 'f2.log')  # 目标文件必须存在

# 拷贝文件和权限
shutil.copy('f1.log', 'f2.log')

#递归的去删除文件
shutil.rmtree('f1.log')

压缩和解压缩

import shutil

# 压缩文件
shutil.make_archive(base_name=r'D:\dir',format='zip',root_dir=r'D:\dir')

# 解压文件
shutil.unpack_archive(r'D:\dir',extract_dir=r'D:\dir',format='zip')

更多参数

'''
shutil.copyfileobj 拷贝文件 提供两个文件对象 长度表示缓冲区大小
shutil.copyfile (src, dst) 拷贝文件 提供两个文件路径
shutil.copymode () 拷贝文件权限 提供两个文件路径
shutil.copystat (src, dst) 拷贝文件状态信息后访问后修改权限提供两个文件路径
shutil.copy (src, dst) 拷贝文件和权限 提供两个文件路径
shutil.copy2 (src, dst) 拷贝文件和状态信息 提供两个文件路径
shutil.ignore_patterns ("mp3","*.py") shutil.copytree (src, dst, symlinks=False, ignore=None) 拷贝目录 
shutil.rmtree 删除目录 可以设置忽略文件
shutil.move (src, dst) 移动目录和文件
压缩与解压缩 shutil 可以打包,解压需要按照格式调用对应的模块打包
shutil.make_archive("test","tar","/Users/jerry/PycharmProjects/package/packa ge1")
'''

线程池

python内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致。

import time
from concurrent.futures import ThreadPoolExecutor

def task(num):
    time.sleep(2)
    print(num)
pool = ThreadPoolExecutor(5)
for i in range(32):
    # 去线程池中获取一个线程,并执行task任务。
    pool.submit(task,(i,))

pool.shutdown()
### 控制上述功能执行完毕才能往下走 ###
print('32个任务都执行完毕了')

zipfile模块

zipfile是python里用来做zip格式编码的压缩和解压缩的

zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。

使用

  1. file:zip文件名(包含路径)
  2. mode:r,w,a
  3. compression:zipfile. ZIP_STORED(不压缩)或zipfile. ZIP_DEFLATED(压缩)
  4. allowZip64:True时,表示支持64位的压缩,一般而言,在所压缩的文件大于2G时,会用到这个选项;默认情况下,该值为False,因为Unix系统不支持。

参数介绍

ZipFile.namelist() #获取zip文档内所有文件的名称列表(名称是字符串)。

ZipFile.getinfo(name) #获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。

ZipFile.infolist() #获取zip文档内所有文件的信息,返回一个zipfile.ZipInfo的列表。

ZipFile.extract(member[, path[, pwd]]) #将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称(字符串)或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹;参数pwd为解压密码。

ZipFile.extractall([path[, members[, pwd]]]) #解压zip文档中的所有文件到当前目录。参数members的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。

ZipFile.printdir() #将zip文档内的信息打印到控制台上.包含三列信息:File Name/Modified/Size

ZipFile.read(name[, pwd]) #获取zip文档内指定文件的二进制数据。

ZipFile.write(filename[, arcname[, compress_type]]) #将指定文件添加到zip文档中。filename为文件路径,arcname为添加到zip文档之后保存的名称,参数compress_type表示压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。

zipInfo 的属性如下:

ZipInfo.compress_type #: 压缩类型。
ZipInfo.comment #: 文档说明。
ZipInfo.extr #: 扩展项数据。
ZipInfo.create_system #: 获取创建该zip文档的系统。
ZipInfo.create_version #: 获取 创建zip文档的PKZIP版本。
ZipInfo.extract_version #: 获取 解压zip文档所需的PKZIP版本。
ZipInfo.reserved #: 预留字段,当前实现总是返回0。
ZipInfo.flag_bits #: zip标志位。
ZipInfo.volume #: 文件头的卷标。
ZipInfo.internal_attr #: 内部属性。
ZipInfo.external_attr #: 外部属性。
ZipInfo.header_offset #: 文件头偏移位。
ZipInfo.CRC #: 未压缩文件的CRC-32。
ZipInfo.compress_size #: 获取压缩后的大小。
ZipInfo.file_size #: 获取未压缩的文件大小。

压缩文件

file_path = r'C:\Users\Administrator\Desktop\123'

#创建一个压缩文件,压缩名字叫123.zip
zip_file = zipfile.ZipFile(os.path.basename(file_path) + '.zip',mode='w')
#将文件写入压缩文件中
zip_file.write(file_path)
#关闭zip文件对象
zip_file.close()

解压

z = zipfile.ZipFile('123.zip','r')
z.extractall()

案例:

import zipfile
import os


def create_zip(path):
    """创建一个压缩文件"""
    # 创建一个zip文件对象
    zip_file = zipfile.ZipFile(os.path.basename(path) + ".zip", "w")
    # 将文件写入zip文件中,即将文件压缩
    print('开始压缩文件……')
    for root, dirs, files in os.walk(path, topdown=False):
        for name in dirs:
            print("正在压缩文件夹:" + os.path.join(root, name))
            zip_file.write(os.path.join(root, name))
        for name in files:
            print("正在压缩文件:" + os.path.join(root, name))
            zip_file.write(os.path.join(root, name))
    # 关闭zip文件对象
    zip_file.close()


def uncompress_zip(path):
    """解压缩一个文件"""
    print('正在解压文件中……')
    zfile = zipfile.ZipFile(path, "r")
    zfile.extractall()


# 程序主入口
if __name__ == "__main__":
    # 打包(解压缩)的文件路径(文件名)
    path_info = 'test.zip'
    if os.path.isdir(path_info):
        # 打包
        create_zip(path_info)
        print('压缩完成!')
    elif os.path.isfile(path_info):
        # 解压
        uncompress_zip(path_info)
        print('解压完成!')
    else:
        print('文件类型错误,请重试!')

 

posted @ 2019-11-20 20:36  杨灏  阅读(85)  评论(0编辑  收藏  举报