

以下のプログラムを実行するとエラーとなってしまいます。どこが悪いのでしょうか？

**出力結果:**

[![出力結果](https://i.stack.imgur.com/Fuh1V.png)](https://i.stack.imgur.com/Fuh1V.png)

**プログラム:**

[code]

    import numpy as np
    import sys
    import re
    import time
    acid=[]
    score1=[]
    e=[]
    path="C:Users/足立 広隆/Desktop/profile/"
    wr=open(path+"w.txt","w")
    '''
    def read_fasta(name):
        f = open(name, 'r')
        seq=''
        for line in f.readlines():
            if line[0] != '>':
                seq += line.strip()
        f.close()
        return seq
    '''
    ###
    #X = 'GGGGGUUAAAAAAJJJJJJJJBBBBBBB'#human
    #Y = 'TGTGTGGCTGTCACTC'
    def alimentt(x_al,x_na):
        time.sleep(1)
        X = x_al
        X_name = x_na
        for acid1 in open(path+"write1.txt","r"):
            aci=re.sub("\n","",acid1)
            ac=aci.split("\t")
            if X_name==str(ac[0]):
                acid.append(ac[2])
        print(acid)
        for YY in open(path+"ns8_keggID_sample_protein_ID.txt","r"):
            YY1=re.sub("\n","",YY)
            YY2=YY1.split("\t")
            Y_moto=YY2[0]
            #print(Y_moto)
            Y_name=YY2[1]
            Y = YY2[2]
            if Y_moto==X_name:
                print(Y_name)
                N = len(X)
                M = len(Y)
    
                gap_penalty = -2
    
                H = np.empty((N+1,M+1), dtype='int16')
                L = np.zeros((N+1,M+1), dtype='int8')
    
                H[0,0]=0
                for j in range(1,M+1):
                    H[0,j] = H[0,j-1] + gap_penalty
                    L[0,j] = 0
    
                for i in range(1,N+1):
                    H[i,0] = H[i-1,0] + gap_penalty
                    L[i,0] = 2
    
    # Horizontal:0 Diagonal:1 Vertical:2
                s = np.array([0,0,0],dtype='int')
    
                for i in range(1,N+1):
                    for j in range (1,M+1):
                        s[0] = H[i,j-1] + gap_penalty
    
                        if X[i-1]==Y[j-1]:
                            score = +1
                        else:
                            score = -1
                        s[1] = H[i-1,j-1] + score
    
                        s[2] = H[i-1,j] + gap_penalty
    
                        H[i,j]=np.max(s)
                        L[i,j]=np.argmax(s)
                pairs=[ ]
                i=N
                j=M
                while i!=0 or j!=0:
                    if L[i,j]==0:
                        pairs.append( ["-",Y[j-1]] )
                        j=j-1
                    elif L[i,j]==1:
                        pairs.append( [X[i-1],Y[j-1]] )
                        i=i-1
                        j=j-1
                    else:
                        pairs.append( [X[i-1],"-"] )
                        i=i-1
    
                pairs.reverse()
                i=1
                acid_s=0
                acid_all=0
                acid_p=len(acid)
                for p in pairs:
                    if p[0]!="-":
                        i=i+1
                        for acid_num in acid:
                            if str(i)==acid_num:
                                    #print(p)
                                if p[0]==p[1]:
                                    acid_s=acid_s+1
                ac_all=acid_s/acid_p
                ac_al=str(ac_all)
                    #print(Y_name,ac_all)
                ac_a=[Y_name,ac_al]
                #print(ac_a)
                score1.append(ac_a)
    '''
    #print('SCORE=', H[N,M])
    for p in pairs:
        print(p[0],end='')
    print()
    
    for p in pairs:
        if p[0]==p[1]:
            print('|',end='')
        else:
            print(' ',end='')
    print()
    
    for p in pairs:
        print(p[1],end='')
    print()
    i=0
    for p in pairs:
        if p[0]!="-":
            i=i+1
            if i==12:
                print(p)
    '''
    if __name__ == '__main__':
        wr.write("\t")
        for wwr in open(path+"honyurui.txt"):
            wwr1=re.sub("\n","",wwr)
            wr.write(wwr1+"\t")
            e.append(wwr1)
        wr.write("\n")
        for XX in open(path+"hito_tatejiku.txt","r"):
            score1=[]
            acid=[]
            XX1=re.sub("\n","",XX)
            XX2=XX1.split("\t")
            XX_name=XX2[0]
            XX_aliment=XX2[1]
            print(XX_name)
            alimentt(XX_aliment,XX_name)
            print(score1)
            wr.write(XX_name+"\t")
            for ii in e:
                ii_s=-1
                for jj in score1:
                    jj1=jj[0].split(":")
                    if ii==jj1[0]:
                        ii_s=jj[1]
                wr.write(str(ii_s)+"\t")
            wr.write("\n")
    
[/code]


CC BY-SA 4.0
2020-11-19T08:44:45.733
72060
2020-11-20T07:32:43.343
2020-11-20T04:15:45.933
3060
42597
question
python
プログラム実行時にエラー: ZeroDivisionError: disision by zero


`hito_tatejiku.txt`のタブ区切りデータに記載されている名前に関わるデータが、`write1.txt`の中に無い場合がある、もしくは無い場合の可能性を考慮されていない、と思われます。

行番号は少し違いますが、発生場所から関連部分をたどっていくと以下になります。

[code]

    104:            ac_all=acid_s/acid_p #### エラー発生行(0除算)
        ↓
     95:            acid_p=len(acid)     #### エラー直接原因 acidリストの長さ(要素数)が0
        ↓
     23:def alimentt(x_al,x_na):
     24:    time.sleep(1)
     25:    X = x_al
     26:    X_name = x_na
     27:    for acid1 in open(path+"write1.txt","r"):
     28:        aci=re.sub("\n","",acid1)
     29:        ac=aci.split("\t")       #### タブ区切り"write1.txt"
     30:        if X_name==str(ac[0]):   #### 最初の列が名前で一致すれば
     31:            acid.append(ac[2])   #### 3番目の列のデータをacidリストに追加
        ↓
    140:    for XX in open(path+"hito_tatejiku.txt","r"): ####
    141:        score1=[]
    142:        acid=[]                  #### 初期値は空のリスト
    143:        XX1=re.sub("\n","",XX)
    144:        XX2=XX1.split("\t")      #### タブ区切り"hito_tatejiku.txt"
    145:        XX_name=XX2[0]           #### 最初の列が名前
    146:        XX_aliment=XX2[1]
    147:        print(XX_name)
    148:        alimentt(XX_aliment,XX_name) #### パラメータ指定で呼び出し
    
[/code]

* * *

プログラムの目的や内容の詳細は分かりませんが、大まかな流れからすると以下のような対策が考えられます。

  * 最初の`for`ループ直後(`print(acid)`の部分)には要素数が分かるので、そこで 0 ならメソッドを終了する。
  * 探しても対応するデータが 0 件だったというのも意味があるので、次の`for`ループの中で`score1`にデータを追加出来るところまで処理して、ループの次の回に移行する

**終了するパターンの変更箇所**

[code]

     32:    print(acid)
     33:    acid_p=len(acid) #### 先に acid_p(acidの要素数)を取得しておく
     34:    if acid_p == 0:  #### 0 なら alimentt() を終了する
     35:        return
     36:
     37:    for YY in open(path+"ns8_keggID_sample_protein_ID.txt","r"):
    
[/code]

**続行するパターンの変更箇所**

[code]

     32:    print(acid)
     33:    acid_p=len(acid) #### 先に acid_p(acidの要素数)を取得しておく
     34:
     35:    for YY in open(path+"ns8_keggID_sample_protein_ID.txt","r"):
     36:        YY1=re.sub("\n","",YY)
     37:        YY2=YY1.split("\t")
     38:        Y_moto=YY2[0]
     39:        #print(Y_moto)
     40:        Y_name=YY2[1]
     41:        Y = YY2[2]
     42:        if Y_moto==X_name:
     43:            print(Y_name)
     44:
     45:            #### acid_p が 0 なら以下の本来の処理は無駄らしいので
     46:            #### score1に名前とデータ数'0'(あるいは空文字)を詰めて追加して次のループへ
     47:            if acid_p == 0:
     48:                score1.append([Y_name, '0']) #### あるいは空文字列にする
     49:                continue    #### ここまで追加
     50:
     51:            N = len(X)
     52:            M = len(Y)
    
[/code]


CC BY-SA 4.0
2020-11-19T09:33:19.477
72067
2020-11-20T07:32:43.343
2020-11-20T07:32:43.343
26370
26370
72060
answer