需求:批量修改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"
以上這篇Python修改文件往指定行插入內容的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。