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 相关文章推荐
Python3实现的画图及加载图片动画效果示例
Jan 19 Python
Python模块文件结构代码详解
Feb 03 Python
python实现图片彩色转化为素描
Jan 15 Python
Python检测数据类型的方法总结
May 20 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Python线程指南分享
Nov 19 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python如何删除列为空的行
Jul 17 Python
python中np是做什么的
Jul 21 Python
Python实现小黑屋游戏的完整实例
Jan 06 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
Python 全局空间和局部空间
Apr 06 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
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
php观察者模式应用场景实例详解
2017/02/03 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
javascript验证身份证号
2015/03/03 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
js表单验证实例讲解
2016/03/31 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
举例讲解Python常用模块
2019/03/08 Python
Python字符串的一些操作方法总结
2019/06/10 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
python元组的概念知识点
2019/11/19 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
群教班子对照检查材料
2014/08/26 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
企业财务管理制度范本
2015/08/04 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
python 实现的截屏工具
2021/05/08 Python