[英]Python: find pattern and replace word by referring to another line
"E1 Sys1 (PTAC) (G.WNW2)" = SYSTEM
TYPE = PTAC
HEAT-SOURCE = HEAT-PUMP
BASEBOARD-SOURCE = NONE
SIZING-RATIO = 1.15
MAX-SUPPLY-T = 90
MIN-SUPPLY-T = 55
FAN-SCHEDULE = "S1 Sys1 (PTAC) Fan Sch"
FAN-CONTROL = TWO-SPEED
SUPPLY-STATIC = 0.5
SUPPLY-EFF = 0.33
COOLING-EIR = 0.329152
HEATING-EIR = 0.34025
..
"E1 WNW Perim Zn (G.WNW2)" = ZONE
TYPE = CONDITIONED
MIN-FLOW-RATIO = 1
FLOW/AREA = 0.5
OA-FLOW/PER = 34.6035
DESIGN-HEAT-T = 72
HEAT-TEMP-SCH = "S1 Sys1 (PTAC) Heat Sch"
DESIGN-COOL-T = 75
COOL-TEMP-SCH = "S1 Sys1 (PTAC) Cool Sch"
SIZING-OPTION = ADJUST-LOADS
SPACE = "Unit 100"
..
我有此文本文件用於建築能耗建模。
系統(E1 Sys1(PTAC)(G.WNW2))和區域(E1 WNW Perim Zn(G.WNW2))是一對。
我想通過引用空間名稱並添加縮寫(例如_sys,_zn)來使系統名稱和區域名稱易於理解。
空間名稱將在區域部分的底部。
您能幫我用以下內容代替上面的內容嗎?
"Unit 100_sys" = SYSTEM
TYPE = PTAC
HEAT-SOURCE = HEAT-PUMP
BASEBOARD-SOURCE = NONE
SIZING-RATIO = 1.15
MAX-SUPPLY-T = 90
MIN-SUPPLY-T = 55
FAN-SCHEDULE = "S1 Sys1 (PTAC) Fan Sch"
FAN-CONTROL = TWO-SPEED
SUPPLY-STATIC = 0.5
SUPPLY-EFF = 0.33
COOLING-EIR = 0.329152
HEATING-EIR = 0.34025
..
"Unit 100_zn" = ZONE
TYPE = CONDITIONED
MIN-FLOW-RATIO = 1
FLOW/AREA = 0.5
OA-FLOW/PER = 34.6035
DESIGN-HEAT-T = 72
HEAT-TEMP-SCH = "S1 Sys1 (PTAC) Heat Sch"
DESIGN-COOL-T = 75
COOL-TEMP-SCH = "S1 Sys1 (PTAC) Cool Sch"
SIZING-OPTION = ADJUST-LOADS
SPACE = "Unit 100"
..
您可以嘗試以下方法:
file = open(file_name, "r")
infile = file.readlines()
return_string = ""
for i in range(len(infile)):
infile[i] = infile[i].split() #split into the equation parts
if infile[i][0] == "SPACE": #found space element
space = ' '.join(infile[i][2:]) #take the name which is the third element and after
for i in range(len(infile)):
if infile[i][2] == "ZONE":
infile[i][0] = space + "_zn"
elif infile[i][2] == "SYSTEM":
infile[i][0] = space + "_sys"
return_string += (" ".join(infile[i]) + "\n") #recreating the file
print (return_string)
此代碼假定它將遇到SPACE = xxx的行,否則它將崩潰。 希望這可以幫助
使用帶有復雜regex模式的regex.sub()
函數的簡短解決方案:
import re
with open('yourfile.txt', 'r') as f:
pat = re.compile('"[^"]+"( = SYSTEM[\s\S]+)"[^"]+"( = ZONE[\s\S]+)(SPACE\s*= )"([^"]+)"')
content = pat.sub('"\\4_sys"\\1"\\4_zn"\\2\\3"\\4"', f.read(), re.M)
print(content)
\\\\1
, \\\\2
, \\\\3
, \\\\4
指向捕獲的第1個,第2個,第3個和第4個(捕獲的組是帶括號的序列(...)
) 輸出:
"Unit 100_sys" = SYSTEM
TYPE = PTAC
HEAT-SOURCE = HEAT-PUMP
BASEBOARD-SOURCE = NONE
SIZING-RATIO = 1.15
MAX-SUPPLY-T = 90
MIN-SUPPLY-T = 55
FAN-SCHEDULE = "S1 Sys1 (PTAC) Fan Sch"
FAN-CONTROL = TWO-SPEED
SUPPLY-STATIC = 0.5
SUPPLY-EFF = 0.33
COOLING-EIR = 0.329152
HEATING-EIR = 0.34025
..
"Unit 100_zn" = ZONE
TYPE = CONDITIONED
MIN-FLOW-RATIO = 1
FLOW/AREA = 0.5
OA-FLOW/PER = 34.6035
DESIGN-HEAT-T = 72
HEAT-TEMP-SCH = "S1 Sys1 (PTAC) Heat Sch"
DESIGN-COOL-T = 75
COOL-TEMP-SCH = "S1 Sys1 (PTAC) Cool Sch"
SIZING-OPTION = ADJUST-LOADS
SPACE = "Unit 100"
..
我根據@chngzm提供的方法解決了這個問題。 我分享我的代碼。 這不是花哨的代碼,但它可以工作:)
首先,我列出了SPACE名稱。 我使用了try
和except
函數,因為文本文件包含一些空行。
file = open("targetfile.txt", "r") #Read target file
infile = file.readlines()
return_string = ""
# Making list of SPACE names
space = []
for i in range(len(infile)):
infile[i] = infile[i].split() #split into the equation parts
try:
if infile[i][0] == "SPACE": #found space element
space.append(" ".join(map(str,infile[i][2:]))) #take the name which is the third element and after
except:
continue
space = [x.strip('"') for x in space] #take off quotation marks
然后,根據上面列出的SPACE名稱更改每個SYSTEM和ZONE名稱。
for i in range(len(infile)):
try:
if infile[i][-1] == "SYSTEM":
del infile[i][:-2]
infile[i].insert(0,"\""+space[0] + "_sys"+"\"")
elif infile[i][-1] == "ZONE":
del infile[i][:-2]
infile[i].insert(0,"\""+space[0] + "_zn"+"\"")
del space[0] #remove used SPACE name
return_string += (" ".join(infile[i]) + "\n") #recreating the file
except:
continue
print (return_string)
這段代碼給出了我真正想要的。 如果您讓我知道任何更好的方法,我將不勝感激。 再次感謝! @chngzm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.