2017-02-19 6 views
1

のうちリストインデックスIは、csvファイルを解析するために、このコードを使用しようとしていますが、このエラーの周りに自分の道を見つけることができません。はIndexError:範囲のCSVパーサ

の「ファイル 『(ファイルの場所)』、ライン438を、 parser_42

位置= TMP2 [1]

はIndexError:

変異係数SCO:範囲外のリストインデックス」

が私のcsvファイルがそうのように構成されています

Q41V -0.19 0.05

再Q41L -0.08 0.26

Q41T -0.21 0.43

I23V -0.02 0.45

I61V 0.01 1.12

私は突然変異体を取りたいです「Q」41と「V」とを分離する。 次に、位置と重量のリストを作成し、数値順に並べたいと思います。

目標は明らかに新しいCSVファイルに

を文字列「配列」を書くことで、私はPythonとデータ操作で初心者です。誰かが私を正しい方向に向けることができますか?興味があるかもしれない人のため

def parser_42(csv_in, fasta_in, *args): 

    with open(csv_in, 'r') as tsv_in: 
     tsv_in = csv.reader(tsv_in, delimiter='\t') 
     next(tsv_in) # data starts on line 7 
     next(tsv_in) 
     next(tsv_in) 
     next(tsv_in) 
     next(tsv_in) 
     next(tsv_in) 

     for row in tsv_in: 
      tmp = row[0].split(',') 
      tmp2 = re.split('(\d+)', tmp[0]) 
      wt = tmp2[0] 
      position = tmp2[1] 
      substitution = tmp[2] 

      seq = "" 
      current_positions = [] 


      if position not in current_positions: 
       current_positions += [position] 
       print(current_positions) 
       seq += wt 
      else: 
       continue 

     print(seq) 
+0

あなたのcsvファイルのみTMP2 'と第2の値をアクセスもしようとしている1行あたりの値とyoureのを持っているように、[1]あなたはおそらく、おそらく、ファイルの末尾に、どこかの空の行を持って' – Craicerjack

+0

見えます。 – TigerhawkT3

+0

分割した後、存在しないインデックスにアクセスする前に結果の長さを確認できます。 –

答えて

1

、これは私が私の問題を解決する方法です...誰もが、これはもう少し簡潔にする方法上の任意の提案を持っている場合、アドバイスをいただければ幸いです。私はこれがおそらく小規模な問題を解決するラウンドアバウトのように思えるが、私は過度に心配していないので、プロセスでかなりの量を学んだ:)。私は基本的に.split()を正規表現に置き換えました。これはもう少しきれいです。

def parser_42(csv_in, fasta_in, *args): 
    dataset = pd.DataFrame(columns=get_column_names()) 
    with open(csv_in) as tsv_in: 
     tsv_in = csv.reader(tsv_in, delimiter='\t') 
     next(tsv_in) #data starts on row 7 
     next(tsv_in) 
     next(tsv_in) 
     next(tsv_in) 
     next(tsv_in) 
     next(tsv_in) 
     save_path = '(directory path)' 
     complete_fasta_filename = os.path.join(save_path, 'dataset_42_seq.fasta.txt') 
     output_fasta_file = open(complete_fasta_filename, 'w') 

     seq = '' 
     current_positions = [] 

     for row in tsv_in: 

     # regular expressions to split numbers and characters in single cell 
      regepx_match = re.match(r'([A-Z])([0-9]+)([A-Z,*])', row[0], re.M | re.I) 
      wt = regepx_match.group(1) 
      position = int(regepx_match.group(2)) 
      substitution = regepx_match.group(3) 

      if position not in current_positions: 
       current_positions += [position] 
       seq += wt 
      else: 
       continue 
     seq = list(seq) 

    # this zips seq and current_positions and sorts seq 
     sorted_y_idx_list = sorted(range(len(current_positions)), key=lambda x: current_positions[x]) 
     Xs = [seq[i] for i in sorted_y_idx_list] 

     seq1 = '>dataset_42 fasta\n' 
     seq1 = seq1 + ''.join(Xs) # join to string 


     output_fasta_file.write(seq1) 
     output_fasta_file.close() 
関連する問題