python 解压、复制、删除 文件的实例代码


Posted in Python onFebruary 26, 2020

压缩复制删除文件基于python语言怎么操作呢,压缩文件有四种格式:zip、rar、tar、tar.gz,在压缩过程中也容易出现很多问题,今天小编通过代码给大家详解,具体内容如下所示:

一、python3解压文件

1.python 解压文件代码示例

如下代码主要实现zip、rar、tar、tar.gz四种格式的压缩文件的解压

def unzip_file(src_file, dst_dir=None, unzipped_files=None, del_flag=True):
 """
 根据指定的压缩文件类型递归解压所有指定类型的压缩文件
 :param src_file: 解压的源文件路径,可以为文件夹路径也可以是文件路径
 :param dst_dir: 解压后的文件存储路径
 :param unzipped_files: 完成解压的文件名列表
 :param del_flag: 解压完成后是否删除原压缩文件,默认删除
 :return: 完成解压的文件名列表
 """
 # 完成解压的文件名列表初始为空
 if unzipped_files is None:
  unzipped_files = []
 # 指定的解压文件类型
 zip_types = ['.zip', '.rar', '.tar', '.gz']

 def exec_decompress(zip_file, dst_dir):
  """
  解压实现的公共代码
  :param zip_file: 压缩文件全路径
  :param dst_dir: 解压后文件存储路径
  :return:
  """
  file_suffix = os.path.splitext(zip_file)[1].lower()
  try:
   print('Start extracting the file: %s' % zip_file)

   # zip 解压
   if file_suffix == '.zip':
    # zip解压 写法一
    with ZipFile(zip_file, mode='r') as zf:
     zf.extractall(dst_dir)
    # zip解压 写法二
    # file_zip = ZipFile(zip_file, mode='r')
    # for file in file_zip.namelist():
    #  file_zip.extract(file, dst_dir)
    # file_zip.close()

   # rar 解压
   elif file_suffix == '.rar':
    rf = rarfile.RarFile(zip_file)
    rf.extractall(dst_dir)

   # tar、tgz(tar.gz) 解压
   elif file_suffix in ['.tar', '.gz']:
    tf = tarfile.open(zip_file)
    tf.extractall(dst_dir)
    # 关闭文件释放内存
    tf.close()

   print('Finished extracting the file: %s' % zip_file)
  except Exception as e:
   print(e)
  # 解压完成加入完成列表
  unzipped_files.append(zip_file)
  # 根据标识执行原压缩文件删除
  if del_flag and os.path.exists(zip_file):
   os.remove(zip_file)

 # 如果传入的文件路径为文件目录,则遍历目录下所有文件
 if os.path.isdir(src_file):
  # 初始化文件目录下存在的压缩文件集合为空
  zip_files = []
  # 如果传入的目的文件路径为空,则取解压的原文件夹路径
  dst_dir = dst_dir if dst_dir else src_file
  # 遍历目录下所有文件
  for file in os.listdir(src_file):
   file_path = os.path.join(src_file, file)
   # 如果是文件夹则继续递归解压
   if os.path.isdir(file_path):
    dst_path = os.path.join(dst_dir, file)
    unzip_file(file_path, dst_path, unzipped_files)
   # 如果是指定类型的压缩文件则加入到压缩文件列表
   elif os.path.isfile(file_path) and os.path.splitext(file_path)[
    1].lower() in zip_types and file_path not in unzipped_files:
    zip_files.append(file_path)
  # 遍历压缩文件列表,执行压缩文件的解压
  for zip_file in zip_files:
   exec_decompress(zip_file, dst_dir)
  # 如果当前目录存在压缩文件则完成所有文件解压后继续遍历
  if zip_files:
   unzip_file(dst_dir, unzipped_files=unzipped_files)
 # 如果传入的文件路径是指定类型的压缩文件则直接执行解压
 elif os.path.isfile(src_file) and os.path.splitext(src_file)[1].lower() in zip_types:
  dst_dir = dst_dir if dst_dir else os.path.dirname(src_file)
  exec_decompress(src_file, dst_dir)

 return unzipped_files

2.python解压常见问题解决办法

2.1 python3 zipfile解压文件名乱码解决办法

直接修改源码,即 zipfile.py 文件:

第一处:

if flags & 0x800:
 # UTF-8 file names extension
 filename = filename.decode('utf-8')
else:
 # Historical ZIP filename encoding
 # 注释原代码
 # filename = filename.decode('cp437')
 # 新加一行代码
 filename = filename.decode('gbk')

 第二处:

if zinfo.flag_bits & 0x800:
 # UTF-8 filename
 fname_str = fname.decode("utf-8")
else:
 # 注释原代码
 # fname_str = fname.decode("cp437")
 # 同样新加一行代码
 fname_str = fname.decode('gbk')

2.1 rar 解压无法找到动态库(unrar.dll)解决办法

报错示例:

python 解压、复制、删除 文件的实例代码

第一步 手动下载动态库文件 unrar.dll 存在本地目录,例如我的本地存储路径为:C:\MySoft\assist\unrar.dll

链接: https://pan.baidu.com/s/1rqhFND9XmtD1Y8yGLEz9kA 提取码: u2my

第二步 修改源码 unrarlib.py 文件

if platform.system() == 'Windows':
 from ctypes.wintypes import HANDLE as WIN_HANDLE
 HANDLE = WIN_HANDLE
 UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint,
          ctypes.c_long, ctypes.c_long,
          ctypes.c_long)
 # 注释原代码
 # lib_path = lib_path or find_library("unrar.dll")
 # 将路径指向下载的动态库文件存储路径
 lib_path = r"C:\MySoft\assist\unrar.dll"
 if lib_path:
  unrarlib = ctypes.WinDLL(lib_path)

知识点扩展:python 压缩文件夹的代码

def zip_ya(start_dir):
  start_dir = start_dir # 要压缩的文件夹路径
  file_news = start_dir + '.zip' # 压缩后文件夹的名字

  z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
  for dir_path, dir_names, file_names in os.walk(start_dir):
   f_path = dir_path.replace(start_dir, '') # 这一句很重要,不replace的话,就从根目录开始复制
   f_path = f_path and f_path + os.sep or '' # 实现当前文件夹以及包含的所有文件的压缩
   for filename in file_names:
    z.write(os.path.join(dir_path, filename), f_path + filename)
  z.close()
  return file_news

PS: 若递归扫描所有文件夹过程中有文件夹里不存在文件, 该文件夹将被忽略

总结

到此这篇关于python 解压、复制、删除 文件的实例代码的文章就介绍到这了,更多相关python 解压、复制、删除 文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
python实现进程间通信简单实例
Jul 23 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
Python格式化css文件的方法
Mar 10 Python
PyQt5实现拖放功能
Apr 25 Python
Python中.join()和os.path.join()两个函数的用法详解
Jun 11 Python
python实现输入数字的连续加减方法
Jun 22 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
Python编写单元测试代码实例
Sep 10 Python
python自动从arxiv下载paper的示例代码
Dec 05 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 Python
Python递归调用实现数字累加的代码
Feb 25 #Python
python烟花效果的代码实例
Feb 25 #Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 #Python
使用python绘制cdf的多种实现方法
Feb 25 #Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 #Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 #Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 #Python
You might like
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
js实现百度淘宝搜索功能
2020/02/17 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
python 实现批量图片识别并翻译
2020/11/02 Python
分享一个python的aes加密代码
2020/12/22 Python
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
2014的自我评价
2014/01/13 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
社区中秋节活动方案
2014/01/29 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
遗失说明具结保证书
2015/02/26 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
小学语文国培研修日志
2015/11/13 职场文书
详解Redis复制原理
2021/06/04 Redis