Python腳本替換Android資源(包名,圖片,文件內(nèi)容)


最近要將Android項(xiàng)目中的gradle,圖片咬展,包名耸峭,字符串等做便捷替換澜躺,以適應(yīng)不同內(nèi)容的更換蝉稳,于是搬出半生不熟的Python抒蚜,通過一系列的文件操作達(dá)到目的。完整項(xiàng)目寫在github上耘戚,歡迎fork

import:

# -*- coding: utf-8 -*-
import os
# import pickle
# import sys
import re
import shutil
from config import local_config
from config import project_drawable

config是我的配置字典集嗡髓,其中包括本地項(xiàng)目路徑、資源路徑和代碼路徑收津、各種文件中要替換的關(guān)鍵字等饿这。

  • 修改文件夾
 # 修改文件夾名字
    def search_dir(self, root_dir, search_dir_name):
        # 兩個參數(shù)分別為項(xiàng)目路徑和要查找的文件名字
        if os.path.isdir(root_dir):
            # print root_dir
            splitl = os.path.split(root_dir)  # 將路徑分割為二元組
            # print splitl[1]
            if splitl[1] == search_dir_name:
                try:
                    os.rename(root_dir, splitl[0] +
                              "/" + local_config["new_city"])
                    print "文件夾 [%s] 已經(jīng)改為 [%s]" \
                        % (root_dir, splitl[0] + "/" +
                            local_config["new_city"])
                except:
                    pass
            else:
                listnew = os.listdir(root_dir)
                for mdir in listnew:
                    path = root_dir + "/" + mdir
                    # print path
                    self.search_dir(path, search_dir_name)
                    pass
        else:
            print root_dir
            # 不是文件夾
            return
        pass
  • 替換項(xiàng)目資源圖片
 # 修改所有資源圖片
    def replace_drawable(self):
        # 替換掉所有類型的mipmap包下的文件
        print "開始替換圖片資源..."
        for pr in project_drawable:
            targetfile = self.search_drawable_in_local(project_drawable[pr])
            if targetfile is not None:
                # 遞歸查找
                # (filename,extension) = os.path.splitext(targetfile)
                targetdir = local_config[
                    "local_drawable_path"] + "/" + targetfile
                print "將替換的圖片資源: %s " % (targetdir)
                self.search_drawable_in_project(
                    local_config["drawable_path"], targetdir)
        print "圖片資源替換完成."
        pass

    # 遞歸替換項(xiàng)目中的資源
    def search_drawable_in_project(self, sourcedir, targetdir):
        if sourcedir.find(".git") >= 0:
            return
        # print sourcedir
        if os.path.isdir(sourcedir):
            # 是文件夾,檢索文件夾內(nèi)文件遞歸
            listdir = os.listdir(sourcedir)
            for ld in listdir:
                if os.path.isdir(ld) and ld.find("mipmap") < 0:
                    continue
                path = sourcedir + "/" + ld
                self.search_drawable_in_project(path, targetdir)
        else:
            # 是文件,判斷是否是要復(fù)制的文件
            splitl = os.path.split(sourcedir)
            targetl = os.path.split(targetdir)
            # print "src: "+splitl[1]+" tar: "+targetl[1]
            if os.path.isfile(sourcedir) and targetl[1] == splitl[1]:
                shutil.copy(targetdir, sourcedir)
            return
        pass

    # 查找本地資源文件(一級目錄)
    def search_drawable_in_local(self, source_id):
        (sourcename, srextension) = os.path.splitext(source_id)
        path = local_config["local_drawable_path"]
        if os.path.isdir(path):
            # 根據(jù)要替換的文件名找到新文件并返回
            listfile = os.listdir(path)
            for file in listfile:
                # ic_launcher.png
                (filename, extension) = os.path.splitext(file)
                if filename == sourcename:
                    return file
        else:
            # 本地資源路徑非文件夾
            return
        pass
        
  • 替換strings中的字段
def replace_strings(self):
        string_path = local_config["strings_path"]
        print "開始讀取strings中的參數(shù)..."
        if os.path.isfile(string_path):
            f = open(string_path, "rb+")
            f.seek(0)
            for line in open(string_path, "r"):
                front_pos = f.tell()
                line = f.readline()
                if not line:
                    break
                rz = re.findall(r'\>(.*)\</', line)
                if line.find("app_name") >= 0 and rz:
                    # print rz[0]
                    f.seek(front_pos)
                    f.write(line.replace(rz[0], local_config["app_name"]))
                pass
            f.close()
            pass
        else:
            print "替換strings參數(shù)失敗."
            return
        print "替換strings參數(shù)完成."
        pass
  • 完整項(xiàng)目寫在github上朋截,歡迎fork

  • 對于文件中字符串的替換蛹稍,這里有一點(diǎn):在不新建和重寫文件的前提下,只在原始文件中替換單獨(dú)行的字符串部服,如果新串的長度小于原始串的長度唆姐,會無法覆蓋完全,
    原串多的部分會繼續(xù)寫在新串后面廓八,這個問題暫時還沒想到很好的解法奉芦,如果有想法歡迎留言,感激不盡剧蹂。

  • 目前寫了一個粗暴的方法声功,在準(zhǔn)備替換當(dāng)前行的數(shù)據(jù)時,先計算本行字符串的長度宠叼,并覆蓋寫入同等數(shù)目的空格先巴,再寫入新數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冒冬,一起剝皮案震驚了整個濱河市伸蚯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌简烤,老刑警劉巖剂邮,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異横侦,居然都是意外死亡挥萌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門枉侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來引瀑,“玉大人,你說我怎么就攤上這事榨馁『┰裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徒像。 經(jīng)常有香客問我黍特,道長,這世上最難降的妖魔是什么锯蛀? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任灭衷,我火速辦了婚禮,結(jié)果婚禮上旁涤,老公的妹妹穿的比我還像新娘翔曲。我一直安慰自己,他們只是感情好劈愚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布瞳遍。 她就那樣靜靜地躺著,像睡著了一般菌羽。 火紅的嫁衣襯著肌膚如雪掠械。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天注祖,我揣著相機(jī)與錄音猾蒂,去河邊找鬼。 笑死是晨,一個胖子當(dāng)著我的面吹牛肚菠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罩缴,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蚊逢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箫章?” 一聲冷哼從身側(cè)響起烙荷,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炉抒,沒想到半個月后奢讨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚叹,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰薄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扒袖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞茅。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖季率,靈堂內(nèi)的尸體忽然破棺而出野瘦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布鞭光,位于F島的核電站吏廉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惰许。R本人自食惡果不足惜席覆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汹买。 院中可真熱鬧佩伤,春花似錦、人聲如沸晦毙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽见妒。三九已至孤荣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間须揣,已是汗流浹背垃环。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返敬,地道東北人遂庄。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像劲赠,于是被迫代替她去往敵國和親涛目。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理凛澎,服務(wù)發(fā)現(xiàn)霹肝,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • #import <WXApi.h> is not found, 找不到WXAPi原因:1.手動集成時, 沒有導(dǎo)入W...
    Chrisbooty閱讀 1,023評論 0 0
  • 今天是周末塑煎,室友都出去吃飯了沫换,我一個人去食堂吃飯,在圖書館準(zhǔn)備著下節(jié)課的上臺講解最铁。任課老師是一位非常嚴(yán)厲的老師...
    我就愛維C閱讀 146評論 0 1
  • 1.香港證券市場的明顯優(yōu)勢 法律監(jiān)管嚴(yán)格讯赏,信息披露透明,停牌制度靈活冷尉; 資金自由流動漱挎,國際資金匯集; 多元化環(huán)球投...
    星晨與大海閱讀 889評論 0 1