最近要將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
對于文件中字符串的替換蛹稍,這里有一點(diǎn):在不新建和重寫文件的前提下,只在原始文件中替換單獨(dú)行的字符串部服,如果新串的長度小于原始串的長度唆姐,會無法覆蓋完全,
原串多的部分會繼續(xù)寫在新串后面廓八,這個問題暫時還沒想到很好的解法奉芦,如果有想法歡迎留言,感激不盡剧蹂。目前寫了一個粗暴的方法声功,在準(zhǔn)備替換當(dāng)前行的數(shù)據(jù)時,先計算本行字符串的長度宠叼,并覆蓋寫入同等數(shù)目的空格先巴,再寫入新數(shù)據(jù)。