Python3将ipa包中的文件按大小排序


Posted in Python onApril 17, 2020

给你个ipa包,解压前输出包大小,解压后把里面的文件按大小排序。

代码如下:

import os
import shutil
import zipfile

_ipa_zip_path = lambda ipa_path: ipa_path.replace('.ipa', '.zip')
_file_size = lambda file_path: os.path.getsize(file_path) / 1024 / 1024


def unzip(zip_path: str) -> str:
 dir_path = None
 if zip_path.endswith('.zip'):
  print(f'{zip_path} file size:{round(_file_size(zip_path),3)}mb')
  zip_name = os.path.basename(zip_path)
  dir_name = zip_name.replace('.zip', '')
  dir_root_path = zip_path.replace(zip_name, '')
  dir_path = os.path.join(dir_root_path, dir_name)
  if os.path.exists(dir_path):
   shutil.rmtree(dir_path)
  os.mkdir(dir_path)
  zip_file = zipfile.ZipFile(zip_path)
  for file_name in zip_file.namelist():
   zip_file.extract(file_name, dir_path)
  zip_file.close()
 return dir_path


def rename_suffix(raw, raw_type, target) -> None:
 if raw.endswith(raw_type) and os.path.exists(raw):
  os.rename(raw, target)


def walk_files(dir_path) -> list:
 file_dicts = []
 if os.path.exists(dir_path):
  for root, dirs, files in os.walk(dir_path, topdown=True):
   for name in files:
    file_path = os.path.join(root, name)
    file_dict = {
     'file_name': name,
     'file_size': round(_file_size(file_path), 8),
    }
    file_dicts.append(file_dict)
 return file_dicts


def show_files_size(dir_path=None) -> None:
 if dir_path:
  file_dicts_sorted = sorted(walk_files(dir_path),
         key=lambda e: (e.__getitem__('file_size'), e.__getitem__('file_name')), reverse=True)
  for file_dict in file_dicts_sorted:
   print(f'{file_dict["file_name"]}->{file_dict["file_size"]}mb')


def ipa_checker(ipa_path: str) -> None:
 try:
  ipa_file_size = _file_size(ipa_path)
  print(f'{ipa_path} file size:{round(ipa_file_size,3)}mb')
 except FileNotFoundError as error:
  print(f'File not exists->{ipa_path}')
 ipa_zip_path = _ipa_zip_path(ipa_path)
 rename_suffix(ipa_path, '.ipa', ipa_zip_path)
 try:
  dir_path = unzip(ipa_zip_path)
  show_files_size(dir_path)
 except OSError as error:
  print(error)


if __name__ == '__main__':
 ipa_path = r'C:\Users\kkk\Desktop\xxx.ipa'
 ipa_checker(ipa_path)

哦了。

补充知识:Python3将两个有序数组合并为一个有序数组

第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性。(不好)

第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到新数组中,从老数组中删掉,直到其中一个数组长度为0。然后再把不为空的老数组中剩下的部分加到新数组的结尾。(好)

第二种思路的排序算法与测试代码如下:

def merge_sort(a, b):
 ret = []
 while len(a)>0 and len(b)>0:
  if a[0] <= b[0]:
   ret.append(a[0])
   a.remove(a[0]) 
  if a[0] >= b[0]:
   ret.append(b[0])
   b.remove(b[0])
 if len(a) == 0:
  ret += b
 if len(b) == 0:
  ret += a
 return ret


if __name__ == '__main__':
 a = [1,3,4,6,7,78,97,190]
 b = [2,5,6,8,10,12,14,16,18]
 print(merge_sort(a, b))

反思了一下上面的过程,不应该用remove方法,因为仔细想一下remove方法可能比较耗时,不算最简单。

改进一下,改用索引元素比较法替代头位元素比较法:

def merge_sort(a, b):
 ret = []
 i = j = 0
 while len(a) >= i + 1 and len(b) >= j + 1:
  if a[i] <= b[j]:
   ret.append(a[i])
   i += 1
  else:
   ret.append(b[j])
   j += 1
 if len(a) > i:
  ret += a[i:]
 if len(b) > j:
  ret += b[j:]
 return ret

if __name__ == '__main__':
 a = [1,3,4,6,7,78,97,190]
 b = [2,5,6,8,10,12,14,16,18]
 print(merge_sort(a, b))

这个基本就是最简单的方法了。

以上这篇Python3将ipa包中的文件按大小排序就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
Python可跨平台实现获取按键的方法
Mar 05 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
Python入门教程之运算符与控制流
Aug 17 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
Python闭包函数定义与用法分析
Jul 20 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
python__name__原理及用法详解
Nov 02 Python
python函数map()和partial()的知识点总结
May 26 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 #Python
pyecharts动态轨迹图的实现示例
Apr 17 #Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 #Python
Python openpyxl 插入折线图实例
Apr 17 #Python
python 画图 图例自由定义方式
Apr 17 #Python
关于python 的legend图例,参数使用说明
Apr 17 #Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 #Python
You might like
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
详解python调用cmd命令三种方法
2019/07/08 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
自我评价怎么写正确呢?
2013/12/02 职场文书
活动策划邀请函
2014/02/06 职场文书
《值日生》教学反思
2014/02/17 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
产品质量保证书范本
2015/02/27 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
小学运动会前导词
2015/07/20 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
python中Matplotlib绘制直线的实例代码
2021/07/04 Python