편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.01.12

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


    파이썬을 이용해서 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 부분만 해결되면 됩니다.

  • 프로필 shnam님의 편집
    날짜2021.01.12

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


    파이썬을 이용해서 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 부분만 해결되면 됩니다.