2017-02-19 21 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 и поместить их в числовом порядке.

Цель состоит в том, чтобы написать строку «SEQ» в новый файл CSV

очевидно, я новичок в питона и данных манипуляций. Я предполагаю, что я просто упускаю из виду что-то глупое ... Может ли кто-нибудь направить меня в правильном направлении?

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 пытаются Acces второго значения с '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()