Python修改檔案往指定行插入內容
阿新 • • 發佈:2018-11-08
需求:批量修改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"