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文件的每个文件的信息的。
使用
- file:zip文件名(包含路径)
- mode:r,w,a
- compression:zipfile. ZIP_STORED(不压缩)或zipfile. ZIP_DEFLATED(压缩)
- 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('文件类型错误,请重试!')