使用python 修改文件內容

   做嵌入式時需要把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方法是不把字符串本身替換的,如果要修改字符串本身還需要有個賦值過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章