簡體   English   中英

Python:查找模式並通過引用另一行替換單詞

[英]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名稱。 我使用了tryexcept函數,因為文本文件包含一些空行。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM