2017-09-06 46 views
0
"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" 
    .. 

我有這個建築能量建模的文本文件。Python:找到模式,並通過參考另一行替換字

系統(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" 
    .. 

回答

1

你可以嘗試沿着線的東西:

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) 

此代碼假定它將運行成一條線在空間= XXX,否則會崩潰。希望這有助於

+0

謝謝你的回答。它沒有工作,如果空格名稱包含空白但它可以幫助我如何解決問題。我正在根據你的方法進行工作。謝謝。 –

+0

我已經改變了那部分空間名稱的空間名稱,我認爲它應該適用於這種情況:) – chngzm

1
使用 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 - 分別指向第一,第二,第三和第四捕獲組(被捕獲組是加括號的序列 (...)

    輸出:

    "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" 
        .. 
    
  • +0

    感謝您的評論。請給出關於如何使用\\ 1,\\ 2,\\ 3,\\ 4的更多解釋。你認爲這種方法可以用於100個配對區域嗎?謝謝! –

    +0

    @Openyoureyes,看我關於被捕獲羣體的解釋說明 – RomanPerekhrest

    1

    我基於@chngzm提供的方法解決了這個問題。我分享我的代碼。這不是一個奇特的代碼,但它的作品:)

    首先,我做了一個空格名稱列表。我使用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