파이썬 고수님들 SyntaxError: invalid syntax 해결방법 부탁드립니다.

조회수 4032회

파이썬을 이용해서 Fire Weather Index를 만들어보려고 하는데 간단한 오류에 막혀서 진행이 안되고 있습니다. 코드도 다 제공된 코드를 사용하고 있는데 에러가 나네요.

import math
import numpy as np

###Define Class FWI Class first###

class FWICLASS:
    def __init__(self,temp,rhum,wind,prcp):
        self.h = rhum
        self.t = temp
        self.w = wind
        self.p = prcp

    def FFMCcalc(self,ffmc0):
        mo = (147.2*(101.0 - ffmc0))/(59.5 + ffmc0) #Eq.1
        if (self.p > 0.5):
            rf = self.p - 0.5 #Eq.2
        if(mo > 150.0):
            mo = (mo+42.5*rf*math.exp(-100.0/(251.0-mo))*(1.0 - mathe.exp(-6.93/rf))) + (0.0015*(mo - 150.0)**2)*math.sqrt(rf) #Eq.3b
        elif mo <= 150.0:
            mo = mo+42.5*rf*math.exp(-100.0/(251.0-mo))*(1.0 - math.exp(-6.93/rf)) #Eq.3a
        if(mo > 250.0):
            mo = 250.0

        ed = 0.942*(self.h**0.679) + (11.0*math.exp((self.h-100.0)/10.0) + 0.18*(21.1-self.t)*(1.0 - 1.0/math.exp(0.1150 * self.h)) #Eq.4
    if(ed < mo):
        ew = 0.618*(self.h**0.753) + (10.0*math.exp((self.h-100.0)/10.0)) + 0.18*(21.1-self.t)*(1.0 - 1.0/math.exp(0.115*self.h)) #Eq.5
        if(mo <= ew):
            kl = 0.424*(1.0-((100.0-self.h)/100.0)**1.7+(0.0694*math.sqrt(self.w))*(1.0 - ((100.0 - self.h)/100.0)**8) #Eq.7a
            kw = kl * (0.581 * math.exp(0.0365 * self.t)) #Eq.7b
            m = ew - (ew - mo)/10.0**kw #Eq.9
        elif mo > ew:
            m = mo
        elif(mo == ed):
            m = mo
        elif mo > ed:
            kl = 0.424*(1.0-(self.h/100.0)**1.7)+(0.0694*math.sqrt(self.w))*(1.0-(self.h/100.0)**8) #Eq.6a
            kw = kl * (0.581*math.exp(0.0365*self.t)) #Eq.6b
            m = ed + (mo-ed)/10.0**kw #Eq.8

        ffmc = (59.5 * (250.0 -m)) / (147.2 + m)
        if (ffmc > 101.0):
            ffmc = 101.0
        if (ffmc <= 0.0):
            ffmc = 0.0

        return ffmc


    def DMCclac(self,dmc0,mth):
        el = [6.5,7.5,9.0,12.8,13.9,13.9,12.4,10.9,9.4,8.0,7.0,6.0]
        t = self.t
        if (t < -1.1):
            t = -1.1

        rk = 1.894*(t+1.1) * (100.0-self.h) * (el[mth-1]*0.0001) #Eqs. 16 and 17
        if self.p > 1.5:
            ra = self.p
            rw = 0.92*ra - 1.27 #Eq.11
            wmi = 20.0 + 280.0/math.exp(0.023*dmc0) #Eq.12
            if dmc0 <= 33.0:
                b = 100.0/(0.5 + 0.3*dmc0) #Eq.13a
            elif dmc0 > 33.0:
                if dmc0 <= 65.0:
                    b = 14.0 - 1.3*math.log(dmc0) #Eq.13b
                elif dmc0 > 65.0:
                    b = 6.2 * math.log(dmc0) - 17.2 #Eq.13c
            wmr = wmi + (1000*rw) / (48.77+b*rw) #Eq.14
            pr = 43.43 * (5.6348 - math.log(wmr-20.0)) #Eq.15
        elif self.p <=1.5:
            pr = dmc0
        if (pr<0.0):
            pr = 0.0
        dmc = pr + rk
        if (dmc<= 1.0):
            dmc = 1.0

        return dmc


    def DCcalc(self,dc0,mth):
        fl = [-1.6, -1.6, -1.6, 0.9, 3.8, 5.8, 6.4, 5.0, 2.4, 0.4, -1.6, -1.6]
        t = self.t

        if(t < -2.8):
            t = -2.8

        pe = (0.36*(t+2.8) + fl[mth-1] )/2 # Eq.22
        if pe <= 0.0:
            pe = 0.0

        if (self.p > 2.8):
            ra = self.p
            rw = 0.83*ra - 1.27 #Eq.18
            smi = 800.0 * math.exp(-dc0/400.0) #Eq.19
            dr = dc0 - 400.0*math.log(1.0 + ((3.937*rw)/smi)) #Eqs.20 and 21
            if (dr > 0.0):
                dc = dr + pe
        elif self.p <= 2.8:
            dc = dc0 + pe

        return dc


    def ISIcalc(self,ffmc):
        mo = 147.2*(101.0-ffmc) / (59.5+ffmc) #Eq.1
        ff = 19.115*math.exp(mo*-0.1386) * (1.0+(mo**5.31)/49300000.0) #Eq.25
        isi = ff * math.exp(0.05039*self.w) #Eq.26

        return isi


    def BUIcalc(self,dmc,dc):
        if dmc <= 0.4*dc:
            bui = (0.8*dc*dmc) / (dmc+0.4*dc) #Eq.27a
        else:
            bui = dmc - (1.0-0.8*dc/(dmc+0.4*dc))*(0.92+(0.0114*dmc)**1.7) #Eq.27b
        if bui < 0.0:
            bui = 0.0

        return bui


    def FWIcalc(self,isi,bui):
        if bui <= 80.0:
            bb = 0.1 * isi * (0.626*bui**0.809 + 2.0) #Eq.28a
        else:
            bb = 0.1*isi*(1000.0/(25+108.64/math.exp(0.023*bui))) # Eq.28b
        if(bb <= 1.0):
            fwi = bb #Eq.30b
        else:
            fwi = math.exp(2.72*(0.434*math.log(bb))**0.647) #Eq.30a

        return fwi

###End of class FWI Class###

    def main():
        ffmc0 = 85.0
        dmc0 = 6.0
        dc0 = 15.0

        infile = open('era5.input.200011_201912.nc','r')
        outfile = open('fwioutput.txt','w')

        try:
            for line in infile:
                mth,day,temp,rhum,wind,prcp=[float(field) for field in line.strip() .lstrip('[').rstrip(']').split()]
                if rhum>100.0:
                    rhum = 100.0

                mth = int(mth)

                fwisystem = FWICLASS(temp,rhum,wind,prcp)

                ffmc = fwisystem.FFMCcalc(ffmc0)
                cmd = fwisystem.DMCcalc(dmc0,mth)
                dc = fwisystem.DCcalc(dc0,mth)
                isi = fwisystem.ISIcalc(ffmc)
                bui = fwisystem.BUIcalc(dmc,dc)
                fwi = fwisystem.FWIcalc(isi,bui)

                ffmc0 = ffmc
                dmc0 = dmc
                dc0 = dc
                outfile.write("%s %s %s %s %s %s n"%(str(ffmc),str(dmc),str(dc),str(isi),str(bui),str(fwi)))
        finally:
            infile.close()
            outfile.close()
    main()

전체적인 코드인데 여기서 문제가 발생하는 부분은 25번째 라인인 if(ed < mo): 에서 SyntaxError: invalid syntax 에러가 발생한다고 합니다. 무엇이 문제일까요? 저 구문이 유효하지 않다면 밑의 DMCcalc 함수도 에러가 나야하는데, FFMCcalc 함수를 제외하고 나머지 코드를 쭉 진행하면 에러없이 잘 진행이 됩니다. 아나콘다 프롬프트에서 코드 한줄한줄 다 입력해보면서 확인하였습니다. 껏다가도 켜보고 주석처리를 해도 그 다음줄에서 에러가 나는데 혹시 해결방법 아시는분 있을까요? 저기 FFMCcalc 부분만 해결되면 됩니다.

  • 들여쓰기 문제 아닌가요? 초보자 2021.1.12 16:23
  • 들여쓰기 문제 같지는 않아 보여요 안그래도 제일 많이 손댄곳이 들여쓰기 부분이거든요 들여쓰기가 잘못되었다면 들여쓰기가 제대로 안되었다는 에러 메시지를 보여주지 않았을까욤? ㅠㅠ shnam 2021.1.12 16:25
  • 올려두신 코드에는 if(ed < mo): 하나만 들여쓰기 안된 채로 톡 튀어나와있습니다만.. FFMCcalc(self,ffmc0) 함수 안에 들어가 있어야 하는 것으로 보이는데 왜 안 들어가 있나요? 초보자 2021.1.12 16:26
  • 그리고 #Eq.4 부분에 괄호 하나 안 닫혀있네요 초보자 2021.1.12 16:33
  • 옹! Eq.4 괄호가 문제였던거 같습니다! 정말 감사드려요! 닉네임을 초보가 아닌 고수로 바꾸시는걸 강추드립니다. shnam 2021.1.12 16:39
  • 칭찬 감사합니다. 안타깝게도 코드를 보고 어느 부분에 문제가 있는지 기본적인 것만 알고 그 외에 저 코드가 대체 뭘 위한 코드인지 분별하지 못하기 때문에 저는 초보가 맞습니다...ㅜㅜ 초보자 2021.1.12 16:41
  • 코드가 뭐하는코드가 중요한게 아니라 저건 분명히 저 index를 만든 기관(캐나다 정부입니다.)에서 제공해주는 코드라서 오류가 왠만해선 날 일이 없는데, 지금 세심히 보니 국가기관에서 제공해주는 코드임에도 불구하고 수정해야 할 부분이 몇개 있는거 같네요 아무리 정부기관이래도 사람이 만드는것이니 실수할 수도 있는법이니깐... 뭔가 편견과 고정관념을 깨는 기분이 드네요 아무튼 정말 등잔밑이 어두운게 맞나봅니다. 추운 날씨 건강관리 잘하시고 다시 한번 감사드립니다! shnam 2021.1.12 16:44
  • 감사합니다 ^^ 초보자 2021.1.12 16:50

1 답변

  • Here is the correct code, enjoy it!

    import math
    class FWICLASS:
        def __init__(self,temp,rhum,wind,prcp):
            self.h = rhum
            self.t = temp
            self.w = wind
            self.p = prcp
        def FFMCcalc(self,ffmc0):
            mo = (147.2*(101.0 - ffmc0))/(59.5+ffmc0)                                       #Eq 1#
            if(self.p > 0.5):
                rf = self.p - 0.5                                                           #Eq 2#
                if(mo > 150.0):
                    mo = (mo + 42.5 * rf * math.exp(-100.0/(251.0-mo)) * \
                    (1.0 - math.exp(-6.93/rf))) + (0.0015*(mo-150.0)**2)*math.srqt(rf)      #Eq 3b#
                elif mo <= 150.0:
                    mo = mo+42.5*rf*math.exp(-100.0/(251.0-mo))*(1.0 - math.exp(-6.93/rf))  #Eq 3a#
                if(mo > 250.0):
                    mo = 250.0
            ed = .942*(self.h**.679) + (11.0*math.exp((self.h-100.0)/10.0))+ \
                0.18*(21.1- self.t)*(1.0 - 1.0/math.exp(.1150 * self.h))                    #Eq 4#
            if(mo < ed):
                ew = .618*(self.h**.753) + (10.0*math.exp((self.h-100.0)/10.0)) + \
                    .18*(21.1-self.t)*(1.0 - 1.0/math.exp(.115 * self.h))                   #Eq 5#
                if(mo <= ew):
                    kl = .424*(1.0-((100.0-self.h)/100.0)**1.7)+(.0694*math.sqrt(self.w))*\
                        (1.0 - ((100.0 - self.h)/100.0)**8)                                 #Eq 7a#
                    kw = kl * (.581 * math.exp(.0365 * self.t))                             #Eq 7b#
                    m = ew - (ew - mo)/10.0**kw                                             #Eq 9#
                elif mo > ew:
                    m = mo
            elif(mo == ed):
                m = mo
            elif mo > ed:
                kl =.424*(1.0-(self.h/100.0)**1.7)+(.0694*math.sqrt(self.w))*\
                    (1.0-(self.h/100.0)**8)                                                 #Eq 6a#
                kw = kl * (.581*math.exp(.0365*self.t))                                     #Eq 6b#
                m = ed + (mo-ed)/10.0 ** kw                                                 #Eq 8#
            ffmc = (59.5 * (250.0 -m)) / (147.2 + m)                                        #Eq 10#
            if (ffmc > 101.0):
                ffmc = 101.0
            if (ffmc <= 0.0):
                ffmc = 0.0
            return ffmc   
        def DMCcalc(self,dmc0,mth):
            el = [6.5,7.5,9.0,12.8,13.9,13.9,12.4,10.9,9.4,8.0,7.0,6.0] 
            t = self.t
            if (t < -1.1):
                t = -1.1
            rk = 1.894*(t+1.1) * (100.0-self.h) * (el[mth-1]*0.0001)                        #Eq 16 y 17#
            if self.p > 1.5:
                ra= self.p
                rw = 0.92*ra - 1.27
                wmi = 20.0 + 280.0/math.exp(0.023*dmc0)
                if dmc0 <= 33.0:
                    b = 100.0 /(0.5 + 0.3*dmc0)
                elif dmc0 > 33.0:
                    if dmc0 <= 65.0:
                        b = 14.0 - 1.3*math.log(dmc0)
                    elif dmc0 > 65.0:
                        b = 6.2 * math.log(dmc0) - 17.2
                wmr = wmi + (1000*rw) / (48.77+b*rw)
                pr = 43.43 * (5.6348 - math.log(wmr-20.0))
            elif self.p <= 1.5:
                pr = dmc0
            if (pr<0.0):
                pr = 0.0
            dmc = pr + rk
            if(dmc<= 1.0):
                dmc = 1.0
            return dmc
        def DCcalc(self,dc0,mth):
            fl = [-1.6, -1.6, -1.6, 0.9, 3.8, 5.8, 6.4, 5.0, 2.4, 0.4, -1.6, -1.6]
            t = self.t
            if(t < -2.8):
                t = -2.8
            pe = (0.36*(t+2.8) + fl[mth-1] )/2 
            if pe <= 0.0:
                pe = 0.0
            if (self.p > 2.8):
                ra = self.p
                rw = 0.83*ra - 1.27
                smi = 800.0 * math.exp(-dc0/400.0) 
                dr = dc0 - 400.0*math.log( 1.0+((3.937*rw)/smi) )
                if (dr > 0.0):
                    dc = dr + pe
            elif self.p <= 2.8:
                dc = dc0 + pe 
            return dc
        def ISIcalc(self,ffmc):
            mo = 147.2*(101.0-ffmc) / (59.5+ffmc)
            ff = 19.115*math.exp(mo*-0.1386) * (1.0+(mo**5.31)/49300000.0)     
            isi = ff * math.exp(0.05039*self.w)
            return isi
        def BUIcalc(self,dmc,dc):
            if dmc <= 0.4*dc:
                bui = (0.8*dc*dmc) / (dmc+0.4*dc)
            else:
                bui = dmc-(1.0-0.8*dc/(dmc+0.4*dc))*(0.92+(0.0114*dmc)**1.7)
            if bui < 0.0:
                bui = 0.0
            return bui
        def FWIcalc(self,isi,bui):
            if bui <= 80.0:
                bb = 0.1 * isi * (0.626*bui**0.809 + 2.0)
            else:
                bb = 0.1*isi*(1000.0/(25. + 108.64/math.exp(0.023*bui)))
            if(bb <= 1.0):
                fwi = bb
            else:
                fwi = math.exp(2.72 * (0.434*math.log(bb))**0.647)
            return fwi
    def main():
        ffmc0 = 85.0
        dmc0 = 6.0
        dc0 = 15.0
        infile = open('data.txt','r')
        outfile = open('fwioutput.txt','w')
        try:
            for line in infile:
                mth,day,temp,rhum,wind,prcp=[float(field) for field in line.strip() .lstrip('[').rstrip(']').split()]
                if rhum>100.0:
                    rhum = 100.0
    
                mth = int(mth)
    
                fwisystem = FWICLASS(temp,rhum,wind,prcp)
    
                ffmc = fwisystem.FFMCcalc(ffmc0)
                dmc = fwisystem.DMCcalc(dmc0,mth)
                dc = fwisystem.DCcalc(dc0,mth)
                isi = fwisystem.ISIcalc(ffmc)
                bui = fwisystem.BUIcalc(dmc,dc)
                fwi = fwisystem.FWIcalc(isi,bui)
    
                ffmc0 = ffmc
                dmc0 = dmc
                dc0 = dc
                outfile.write("%s %s %s %s %s %s \n"%(str(ffmc),str(dmc),str(dc),str(isi),str(bui),str(fwi)))
        finally:
            infile.close()
            outfile.close()
    main()
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)