Python3将ipa包中的文件按大小排序

给你个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包中的文件按大小排序就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python中sort和sorted排序的实例方法

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorted()方法.它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序. >>> sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] 你也可以使用list.sort()方法来排序,此时list本身将被修改.通常此方法不如sorted()方便,但

  • python sort、sorted高级排序技巧

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorted()方法.它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序. 复制代码 代码如下: >>> sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] 你也可以使用list.sort()方法来排序,此时list本身将被修改.通常此方法不如s

  • python3 sorted 如何实现自定义排序标准

    在 python2 中,如果想要自定义评价标准的话,可以这么做 def cmp(a, b): # 如果逻辑上认为 a < b ,返回 -1 # 如果逻辑上认为 a > b , 返回 1 # 如果逻辑上认为 a == b, 返回 0 pass a = [2,3,1,2] a = sorted(a, cmp) 但是在 python3 中,cmp 这个参数已经被移除了,那么在 python3 中应该怎么实现 python2 的 cmp 功能呢? import functools def cmp(a,

  • Python3将ipa包中的文件按大小排序

    给你个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: d

  • 解决SpringBoot jar包中的文件读取问题实现

    前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档.导出模版等),本地开发时可以正常读取 ,但是,当我们打成jar包发布到服务器后,再次执行程序时就会抛出找不到文件的异常. 背景 这个问题是在一次使用freemarker模版引擎导出word报告时发现的.大概说一下docx导出java实现思路:导出word的文档格式为docx,事先准备好一个排好版的docx文档作为模版,读取解析该模版,将其中的静态资源

  • List集合对象中按照不同属性大小排序的实例

    实例如下: package com.huad.luck; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Test { public static void main(String[] args) { Person p = new Person(); p.setName("tom"); p.

  • Golang中Map按照Value大小排序的方法实例

    目录 起因 探索 实现 第一步 第二步 第三步 总结 总结 Golang中的 map 默认是 无序的 . 起因 最近项目中有这样一个需求: 根据用户当前的坐标点,获取该用户附近的预设城市名称. 这里有一个注意点是,假设这些支持的城市名称是预设的,所以就不能直接通过地图类api根据坐标点获取所在城市名称了. 想到的解决思路是: 获取这几个预设城市的坐标点 App端获取用户当前坐标点 分别计算得到该用户坐标点距离各个预设城市的坐标点距离 然后计算得到其中距离最小的一项 这个坐标点对应的城市就是所求

  • PowerShell查找分区中最大文件的方法(查找文件并按大小排序)

    本文介绍一个PowerShell命令,用于将某个目录或磁盘(如D盘)下占用空间最大的前几个文件.这个任务在其它编程语言中,可能要大段大段的代码,而在PowerShell中,我们只需要一行. 当我们发现某个盘空间不足时,作为管理员,我们得要将该盘上的无用的文件做一些清理.面对这项工作,我们得要想哪些是无用的文件,哪些是占用空间比较大的文件.在实际操作过程中,我们不太可能花费大量的时间和精力去把所有的无用的文件都清除掉,所以,最佳的实践是找出占用空间最大的一些文件,然后来判断一下哪些是无用的.将这些

  • Java如何读取jar包中的resource资源文件

    目录 1.需求 2.问题 3.IDEA读取resource资源 3.1.方法1 3.2.方法2 4.打成jar包后读取resource资源 4.1.读取jar包中的资源文件 4.2.遍历jar包资源目录 1.需求 在Java项目中,需要读取resource资源目录下的文件,以及遍历指定资源目录下的所有文件,并且在读取文件时保留文件相对路径. 2.问题 在IDEA中运行时,可以获取并遍历指定资源,但是将Java项目打成jar包运行后,就无法获取resource资源目录下的文件. 3.IDEA读取r

  • Android 如何实现exclude aar包中的某个jar包

    场景一 要移除的jar包不在aar包中的classes.jar中 直接把aar包里的Jar打包的时候给去掉,就像下面这这样.注意,要使用exclude module这种方式,直接使用exclude group方式没有效果.exclude group的方法适用于exclude JAR包中的文件. implementation(name: '×××××××aar包', ext: 'aar') { exclude module: 'gson' } 场景二 要移除的jar包在aar包中的classes.

  • Python3.6-MySql中插入文件路径,丢失反斜杠的解决方法

    如下所示: 如上图,replace即可. 以上这篇Python3.6-MySql中插入文件路径,丢失反斜杠的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • dom4j从jar包中读取xml文件的方法

    进行封装的时候,我们常常需要用xml来定义一些规范,在单独运行读取的时候当然不会有问题,但这些xml是往往是放在jar包里的,这样一来,这些东西就找不出来了.文中用到的xml定义如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><ACCESOS> <item>  <SOCIO name="adsf">   <NUMERO>00045

  • Java实现从jar包中读取指定文件的方法

    本文实例讲述了Java实现从jar包中读取指定文件的方法.分享给大家供大家参考,具体如下: 以下的Java代码实现了从一个jar包中读取指定文件的功能: /** * This class implements the funcationality of reading and writing files in jar files. */ package com.leo.util; import java.io.InputStream; import java.io.FileOutputStrea

随机推荐