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 相关文章推荐
linux下python抓屏实现方法
May 22 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 Python
Python字典及字典基本操作方法详解
Jan 30 Python
python读取中文txt文本的方法
Apr 12 Python
利用python如何处理nc数据详解
May 23 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
python处理excel绘制雷达图
Oct 18 Python
python实现人机猜拳小游戏
Feb 03 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
Pandas数据结构之Series的使用
Mar 31 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP开发文件系统实例讲解
2006/10/09 PHP
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
让您的菜单不离网站
2006/10/03 Javascript
js 判断 enter 事件
2009/02/12 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python模拟百度登录实例详解
2016/01/20 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
python中setuptools的作用是什么
2020/06/19 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
工会主席事迹材料
2014/06/03 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
领导班子整改方案
2014/10/25 职场文书
党员证明模板
2015/06/19 职场文书
实践论读书笔记
2015/06/29 职场文书
工作自我评价范文
2019/03/21 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle