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实现将一个数组逆序输出的方法
Jun 25 Python
Python3爬虫学习入门教程
Dec 11 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
Python切图九宫格的实现方法
Oct 10 Python
Python实现自动访问网页的例子
Feb 21 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
PyQt5实现简单的计算器
May 30 Python
如何利用python生成MD5并去重
Dec 07 Python
Python爬虫回测股票的实例讲解
Jan 22 Python
python 实现的截屏工具
May 08 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 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实现WEB动态网页静态
2006/10/09 PHP
php 随机生成10位字符代码
2009/03/26 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
php中autoload的用法总结
2013/11/08 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
JavaScript加强之自定义event事件
2013/09/21 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
js简易版购物车功能
2017/06/17 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
python读取和保存视频文件
2018/04/16 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
外贸主管求职简历的自我评价
2013/10/23 职场文书
校园活动策划书范文
2014/01/10 职场文书
《草原》教学反思
2014/02/15 职场文书
公司承诺书怎么写
2014/05/24 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
学生逃课检讨书
2015/02/17 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python