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自动发邮件脚本
Mar 31 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
Python实现excel转sqlite的方法
Jul 17 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
python实现的自动发送消息功能详解
Aug 15 Python
Python3视频转字符动画的实例代码
Aug 29 Python
python中os.remove()用法及注意事项
Jan 31 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 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中如何直接执行SHELL
2013/06/28 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
Python安装OpenCV的示例代码
2020/03/05 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
会计系个人求职信范文分享
2013/12/20 职场文书
村干部承诺书
2014/03/28 职场文书
星级党支部申报材料
2014/05/31 职场文书
国际金融专业自荐信
2014/07/05 职场文书
工作证明格式及范本
2014/09/12 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
医德医风自我评价2015
2015/03/03 职场文书
宾馆安全管理制度
2015/08/06 职场文书
小学总务工作总结
2015/08/13 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers