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 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
Django学习笔记之ORM基础教程
Mar 27 Python
python斐波那契数列的计算方法
Sep 27 Python
解决python Markdown模块乱码的问题
Feb 14 Python
python自动化之Ansible的安装教程
Jun 13 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Python如何将将模块分割成多个文件
Aug 04 Python
python实现一个简单RPC框架的示例
Oct 28 Python
python实现计算图形面积
Feb 22 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正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
python数组过滤实现方法
2015/07/27 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
经管应届生求职信
2013/11/17 职场文书
校园新闻广播稿
2014/01/10 职场文书
年终总结会议主持词
2014/03/17 职场文书
年终奖发放方案
2014/06/02 职场文书
校车安全责任书
2014/08/25 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis