亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

無用圖片掃描、刪除腳本(Python)

系統(tǒng) 2301 0

使用Python開發(fā)檢查腳本,原理是:

1. 首先掃描所有特定后綴( '.png', '.jpg', 'jpeg' , '.imageset')等格式的圖片文件 或 圖片文件夾,獲取文件名,存入 allImageFiles 數(shù)組中;

2. 掃描所有代碼文件,逐行分析,若有引用 allImageFiles 內(nèi)圖片文件文件名的字符串,則將該字符串對(duì)應(yīng)的圖片文件列為有用圖片,存入 usedImageFiles 中;

3. 取 allImageFiles 與 usedImageFiles 的差集,即可獲得無用圖片集 unusedFiles ;

4. 輸出無用圖片集 unusedFiles 至文本內(nèi),并計(jì)算總圖片大小、無用圖片大小;

5. 可選地,可刪除所有無用圖片文件 及 圖片文件夾。

為避免誤刪,腳本執(zhí)行結(jié)束后,需要對(duì)刪除的圖片文件 review。

            
              # coding=utf-8

import os, sys, codecs, re, shutil

reload(sys)
sys.setdefaultencoding('utf-8') 

allImageFiles = set()
usedImageFiles = set()

fileCount = 0

'''
upload_failed@1x.png -> upload_failed
'''
removeSuffixReg = re.compile('\d$|@\dx$|\d@\dx$')
def transferImagefileToImageName(imageFile):
    filename = os.path.basename(imageFile)
    (filenameNoExtension, _) = os.path.splitext(filename)
    imageName = removeSuffixReg.sub('', filenameNoExtension)
    return imageName;

def scanAboundentImage(paths):
    def checkImageCallback(fullPath, filename, extension):
        global allImageFiles
        allImageFiles.add(fullPath)

    # 掃描無用圖片文件 (較通用方法)
#    travel(paths, ['.png', '.jpg', 'jpeg', '.imageset'], checkImageCallback)
    # 掃描 ['.png', '.jpg', 'jpeg'] 格式的無用圖片文件,及 ['.imageset'] 格式的無用圖片文件夾 (適用于 iOS)
    travelFilesAndDirs(paths, ['.png', '.jpg', 'jpeg'], ['.imageset'], checkImageCallback)
    
    checkIfImageHasUsed(paths, allImageFiles)
    anylasisImageFilesOutput()

def anylasisImageFilesOutput():
    global allImageFiles, usedImageFiles
    unusedFiles = allImageFiles - usedImageFiles
    unusedSize = 0
    totalSize = 0
    outputFile = open(os.path.join(os.getcwd(), "uselessImage.txt"), "w")
    for aFile in allImageFiles:
        if os.path.exists(aFile):
            totalSize += countSize(aFile)

    for unusedFile in unusedFiles:
        if os.path.exists(unusedFile):
            unusedSize += countSize(unusedFile)
#            print(unusedFile)
            # 無用文件列表:輸出至 -> 腳本所在目錄下的 文本文件中
            print >> outputFile, unusedFile
            # 刪除所有無用圖片 or 目錄,默認(rèn)禁用
            #removeFilesOrDirs(unusedFile)

    outputFile.close()
    print('all files count is %s \nunused files count is %s' % (len(allImageFiles), len(unusedFiles)))
    print('total size of file is %s KB \nunused file size is %s KB' % (totalSize / 1024, unusedSize / 1024))

def removeFilesOrDirs(path):
    if os.path.exists(path):
        if os.path.isfile(path):
            os.remove(path)
        elif os.path.isdir(path):
            shutil.rmtree(path)

# 遍歷文件夾,計(jì)算文件大小
def countSize(path):
    totalSize = 0
    #判斷是否為目錄
    if (os.path.isdir(path)):
        # 遍歷目錄下所有文件根,目錄下的每一個(gè)文件夾(包含它自己), 產(chǎn)生3-元組 (dirpath, dirnames, filenames)【文件夾路徑, 文件夾名字, 文件名稱】
        for r, ds, files in os.walk(path):
            #遍歷所有文件
            for file in files:
                totalSize += os.path.getsize(os.path.join(r, file)) #獲取文件大小
    else:
        totalSize = os.path.getsize(path)
    return totalSize

def checkIfImageHasUsed(paths, imageFiles):
    def travelCallback(fullPath, filename, extension):
        fileNameMapToCodeString = {}
        for imageFile in imageFiles:
            fileNameMapToCodeString[imageFile] = "\"%s" % transferImagefileToImageName(imageFile)

        with codecs.open(fullPath, 'r', 'utf-8') as file:
            codeLines = file.readlines()
            for line in codeLines:
                for imageFile, imageNameInCode in fileNameMapToCodeString.iteritems():
                    if imageNameInCode in line:
                        global usedImageFiles
                        usedImageFiles.add(imageFile)

    travel(paths, ['.h', '.m', '.xib', '.storyboard'], travelCallback)

# 搜索所有“文件”,篩選符合后綴規(guī)則的文件
def travel(paths, fileExtensions, callback):
    for path in paths:
        for dirpath, dirnames, filenames in os.walk(path):
            for filename in filenames:
                fullPath = os.path.join(dirpath, filename)
                (_, extension) = os.path.splitext(filename)
                if os.path.exists(fullPath) and extension in fileExtensions:
                    callback(fullPath, filename, extension)


# 搜索所有“文件 + 文件夾”,篩選符合后綴規(guī)則的文件及文件夾。文件所在的文件夾若匹配,則文件不再匹配(不匹配 imageset 內(nèi)部的圖片文件)
def travelFilesAndDirs(paths, fileExtensions, dirExtensions, callback):
    for path in paths:
        for dirpath, dirnames, filenames in os.walk(path):
            for filename in filenames:
                fullPath = os.path.join(dirpath, filename)
                (_, extension) = os.path.splitext(filename)
                if os.path.exists(fullPath) and extension in fileExtensions and not isFileDirHasTargetExtensions(fullPath, dirExtensions):
                    callback(fullPath, filename, extension)

            for dirname in dirnames:
                fullPath = os.path.join(dirpath, dirname)
                (_, extension) = os.path.splitext(dirname)
                if os.path.exists(fullPath) and extension in dirExtensions:
                    callback(fullPath, dirname, extension)

def isFileDirHasTargetExtensions(path, dirExtensions):
    parentDirName = os.path.basename(os.path.dirname(path))
    (_, extension) = os.path.splitext(parentDirName)
    return extension in dirExtensions


if sys.argv[1:]:
    scanAboundentImage(sys.argv[1:])
else:
    print "Please pass the paths to check as parameters to the script"
            
          

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲免费色视频 | 欧美一级网址 | 日日夜夜天天 | 天天干夜夜谢 | 国产成人精品一区二区仙踪林 | 欧美亚洲国产激情一区二区 | 综合在线视频精品专区 | 日韩精品一区二区三区国语自制 | 亚洲视频在线视频 | 午夜一级毛片 | 狠狠综合久久久久综合小说网 | 免费一级真人毛片 | 天天干天天做天天操 | 久久精品欧美日韩精品 | 中文字幕久热精品视频免费 | 999精品视频在线观看 | 久久精品成人欧美大片免费 | 色射色| 999精品视频 | 久久99精品视免费看 | 99香蕉国产 | 婷婷色婷婷| 国产尤物在线播放 | 久青草国产手机在线视频 | 久久99精品视香蕉蕉 | 成人a免费视频播放 | 前田香织一区二区中文字幕 | 久久精品国产亚洲沈樵 | 国产精品视频免费的 | 美女视频91 | 一级毛片免费毛片一级毛片免费 | 日韩爱爱小视频 | 在线观看一级毛片 | 亚洲精品国自产拍影院 | 欧美人与鲁交大毛片免费 | 免费观看成人久久网免费观看 | 一级爱| 国产手机精品一区二区 | 国产日韩精品一区在线观看播放 | 欧日韩在线不卡视频 | 国产成年网站v片在线观看 国产成人 免费观看 |