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 26 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
python安装教程 Pycharm安装详细教程
May 02 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
Python基本知识点总结
Apr 07 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 SDK之微信公众号支付代码详解
2015/12/09 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
浅析vue深复制
2018/01/29 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
python中for语句简单遍历数据的方法
2015/05/07 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
机电一体化自荐信
2013/12/10 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
客户答谢会致辞
2015/01/20 职场文书
总经理助理岗位职责
2015/01/31 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
2016党员入党决心书
2015/09/22 职场文书