1. 解压rar文件

使用python解压或压缩rar文件需要其他工具的支持,按照以下步骤即可配置好环境:

  1. 安装unrar模块:pip install unrar
  2. 下载安装WinRAR软件,下载地址:WinRAR
  3. 安装上述软件后,把WinRAR.exe所在路径添加到环境变量,如下图:
  4. python 导出压缩文件加密 python压缩文件为rar_python

    python 导出压缩文件加密 python压缩文件为rar_python_02

  5. 示例程序
import rarfile
rarfile_path = "test.rar"
rf = rarfile.RarFile(rarfile_path , mode='r') # mode的值只能为'r'
rf_list = rf.namelist() # 得到压缩包里所有的文件
print('rar文件内容', rf_list)

dest_path = "./storepath"

for f in rf_list:
    rf.extract(f, dest_path)  # 循环解压,将文件解压到指定路径

# 一次性解压所有文件到指定目录
rf.extractall(dest_path) # 不传path,默认为当前目录
  1. 解压过程可能会遇到缓存空间不足的问题,报错 rarfile.BadRarFile:Failed the read enough data: req=16384 got=0,如下图
    8. 解决方法,找到rarfile.py中的这一行,把第一个数字改大,如下图

2. 解压zip文件

import zipfile

'''
基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]])
mode:可选 r,w,a 代表不同的打开文件的方式;r 只读;w 重写;a 添加
compression:指出这个 zipfile 用什么压缩方法,默认是 ZIP_STORED,另一种选择是 ZIP_DEFLATED;
allowZip64:bool型变量,当设置为True时可以创建大于 2G 的 zip 文件,默认值 True;

'''
zipfile_path = "test.zip"
zip_file = zipfile.ZipFile(zipfile_path)
zip_list = zip_file.namelist() # 得到压缩包里所有文件

dest_path = "./storepath"

for f in zip_list:
    zip_file.extract(f, dest_path) # 循环解压文件到指定目录

zip_file.extractall(dest_path)

zip_file.close() # 关闭文件,必须有,释放内存,或者用下面的with形式

with zipfile.ZipFile(zipfile_path, mode="a") as f:
	f.extractall(dest_path)

# 其他相关方法
zipfile.is_zipfile('xxx.zip') # 判断文件是否是个有效的zipfile
zipfile.namelist('xxx.zip') # 列表,存储zip文件中所有子文件的path(相对于zip文件包而言的)
zipfile.infolist('xxx.zip') # 列表,存储每个zip文件中子文件的ZipInfo对象
zipfile.printdir() # 打印输出zip文件的目录结构,包括每个文件的path,修改时间和大小
zipfile.open(name[,mode[,pwd]]) # 获取一个子文件的文件对象,可以对其进行read,readline,write等操作
zipfile.setpassword(psw),为zip文件设置默认密码
zipfile.testzip() # 读取zip中的所有文件,验证他们的CRC校验和。返回第一个损坏文件的名称,如果所有文件都是完整的就返回None
zipfile.write(filename[,arcname[,compression_type]]) # 将zip外的文件filename写入到名为arcname的子文件中(当然arcname也是带有相对zip包的路径的),打开方式为w或a
zipfile.extract(member, path=None, pwd=None) # 解压一个zip中的文件,path为解压存储路径,pwd为密码
zipfile.extractall(path[,pwd]) # 解压zip中的所有文件,path为解压存储路径,pwd为密码

3. 使用shutil复制文件

  • shutil的copyfile函数复制文件常常容易出错,出现如PermissionError Permission denied 等错误,但导致该问题的原因,有时并非文件权限不足,而是src、dst不是符合要求的路径。
  • 具体来说,src、dst在shutil不同的函数接口中,有的是目录地址(directory),有的是完整的文件地址(file),需要注意区分。
import shutil

# 这里src是文件地址,dst可以是目录地址或者文件地址.
# 如果dst是文件夹路径,则会以src中文件的basename作为文件名称进行复制。

shutil.copy(src, dst, *, follow_symlinks=True) 

shutil.copyfile(src, dst, *, follow_symlinks=True) 这里src和dst都是文件地址。

错误1:dst如果是目录地址,则会报错PermissionError: [Errno 13] Permission denied

错误2:dst必须是可写地址,否则会报错OSError

错误3:如果src和dst是同一路径,则会报错SameFileError

用shutil.copy复制文件或目录:

# 用copy复制文件:src是文件路径,dst可以是文件或目录
shutil.copy("F:\\src_path\\test.txt","J:\\dst_path\\")

用shutil.copyfile复制文件:

# 用copyfile复制文件: src和dst都必须为文件路径
shutil.copyfile("J:\\src_path\\test.txt","J:\\dst_path\\test.txt")

用shutil.copytree复制目录:

# 用copytree复制目录:src和dst都必须是目录
shutil.copytree("J:\\src_path\\","J:\\dst_path\\")

一般情况下,如果复制的文件不需要改名,则用shutil.copy即可,dst用目录,其他相关函数

shutil.move移动文件(相当于剪切、粘贴):

#移动文件或目录
shutil.move("J:\\src_path\\b.txt","J:\\dst_path\\")