1. 程式人生 > >Python修改檔案往指定行插入內容

Python修改檔案往指定行插入內容

需求:批量修改py檔案中的類屬性,為類增加一個core = True新的屬性

原py檔案如下
a.py

class A():
    description = "abc"

現在有一個1.txt文字,內容如下,如果有py檔案中的description跟txt文字中的一樣,則增加core屬性
1.txt

description = "abc"
description = "123"

實現思路:
1.需要遍歷code目錄下的所有py檔案,然後讀取所有行數內容儲存到lines列表中
2.遍歷每個檔案的每一行,匹配1.txt中的description,如果匹配中,就返回行號
3.往lines列表中根據行號插入要增加的新屬性
4.重新寫回原檔案,達到修改檔案的目的

如果修改成功後,效果應該是這樣的
a.py

class A():
    description = "abc"
    core = True

實現程式碼:

import os

original_folder = 'E:\\code\\'


core_list = []

count = 0

# if the description is in the current line
def isMatchDescription(line_buffer):
    global core_list

    # if not catch the core_list in global, reload it.
if not core_list: with open("./core.txt","r") as f: core_list = f.readlines() # if match the core description for des in core_list: if line_buffer.strip() == des.strip(): return True return False def modifySignatures(): for dirpath, dirnames, filenames in
os.walk(original_folder): for filename in filenames: modifyFile(os.path.join(dirpath,filename)) def modifyFile(filename): global count #print "Current file: %s"% filename lines = [] with open(filename,"r") as f: lines = f.readlines() hit = 0 # Enume every single line for match the description for index, line in enumerate(lines): if isMatchDescription(line): hit = index print hit print "Matched file:%s" % filename count+=1 if hit > 0: lines.insert(hit-1,' core = True\n') f.close() # Write back to file with open(filename,"w") as f: for line in lines: f.write(line) f.close() if __name__ == '__main__': modifySignatures() print "Modified:%d"%count

程式碼中的lines.insert(hit-1,' core = True\n')這一行,hit代表目標py檔案的description屬性的行號,我之前用的是hit+1,但是後面發現有些檔案出現了語法錯誤,原因是py檔案中有些description的值太長,導致原檔案使用了程式碼換行符\,如下:

a.py

class A():
    description = "abc\
    aaaaabbbbb"

這樣的如果修改後就變成了

class A():
    description = "abc\
    core = True
    aaaaabbbbb"

為了避免這個bug,後面我才改成了hit-1

lines.insert(hit-1,' core = True\n')

這樣修改的py檔案後就是這樣的效果

class A():
    core = True
    description = "abc\
    aaaaabbbbb"