做嵌入式時需要把windows 下的 ads 工程 項目移植到linux 下的gnu項目時候需要做大量重複的修改,比如把
ABC EQU 1
修改爲
#define ABC 1
如果用手工一個個修改很浪費時間,所以就用python腳本來做這些工作,發現很容易就搞定了(以前遇到類似問題總是用c代碼來寫,代碼量很多而且容易出錯!!)
源代碼如下:
def func():
ffrom=open("2440init.s","r")
fto=open("2440init1.s","w")
while True:
l = ffrom.readline()
if not l:
break
if 'EQU' in l:
temp = l.split("EQU")
temp1 = '#define ' + temp[0] + temp[1]
#print temp1
fto.write(temp1)
else:
temp1 = l
fto.write(temp1)
if __name__ == "__main__":
func()
用一個文件 2440init.s 來測試下:
abc EQU 1
pds EQU 9
最終生成的文件2440init1.s 內容如下所示:
#define abc 1
#define pds 9
前面既然說了是替換文件的內容,那麼ffrom 跟 fto 打開的應該是同一個文件,但是發現寫文件輸出流打開後,會自動清空文件(append模式除外) 貌似和java表現一樣的。
可以嘗試首先讀方式打開,讀到緩衝區裏面,關閉文件。然後再寫方式打開,代碼如下
def func():
input = open("2440init.s")
lines = input.readlines()
input.close()
output = open("2440init.s",'w');
for line in lines:
#print line
if not line:
break
if 'EQU' in line:
temp = line.split("EQU")
temp1 = '#define ' + temp[0] + temp[1]
output.write(temp1)
else:
output.write(line)
output.close()
if __name__ == "__main__":
func()
如果一個比較大的工程文件,需要遍歷工程中的每一個文件。
import os
def direc():
for d,fd,fl in os.walk('/dir to/gun-ucos'):
for f in fl:
sufix = os.path.splitext(f)[1][1:]
if ( (sufix == 'h') or (sufix == 'c') ):
#print sufix
func(d + '/' + f)
上面的 for d,fd,fl in os.walk('/dir to/gun-ucos')
執行完畢之後 fl 爲包含文件名的列表,d爲目錄。然後再通過 splitext 函數獲取擴展名。
函數split 用途是把一個字符串分割開來,比如一個字符串 SKY_REGION_DLGTPL
執行split('DLGTPL')
之後就會變成一個列表 ['#ifndef SKY_REGION_', '\n']
如果只是簡單的替換可以用replace函數,比如把 SKY_REGION_DLGTPL
替換爲 SKY_REGION_DHRU
if ('SKY_REGION_DLGTPL' in line) :
line = line.replace('DLGTPL','DHRU')
注意到replace方法是不把字符串本身替換的,如果要修改字符串本身還需要有個賦值過程。