2017-02-19 51 views
1

我試圖用這個代碼解析一個CSV文件,但無法找到解決這個錯誤我的方式:IndexError:列表索引超出範圍CSV解析器的

「文件‘(文件位置)’,管道438,在parser_42

位置= TMP2 [1]

IndexError:列表索引超出範圍」

我的CSV文件的結構如下所示:

突變係數在sco重新

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'。 然後,我想要創建位置和wt列表並按數字順序放置它們。

目標是字符串「序列」寫入新的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只有每行和youre設法存取權限第二個值與'TMP2一個值[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() 
相關問題