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下实现二叉堆以及堆排序的示例
Sep 29 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
python实现浪漫的烟花秀
Jan 30 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
pytorch 自定义参数不更新方式
Jan 06 Python
django 认证类配置实现
Nov 11 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
安装APACHE
2007/01/15 PHP
php 魔术方法详解
2014/11/11 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
python上selenium的弹框操作实现
2020/07/13 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
师范应届生求职信
2013/11/15 职场文书
高中生活自我鉴定
2014/01/18 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
实验室的标语
2014/06/20 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
2014年政协工作总结
2014/12/09 职场文书
计划生育工作总结2015
2015/04/03 职场文书
实践论读书笔记
2015/06/29 职场文书