2016-01-15 3 views
1

Я хочу использовать csv.DictReader для чтения одного столбца и в зависимости от значения ниже, я хотел бы напечатать разницу между соответствующими значениями в другом столбце: значение ниже - значение выше.Итерация с помощью csv.DictReader

Я написал этот сценарий:

import csv 

next=None 
last = None 
test_file = 'data.tsv' 
csv_file = csv.DictReader(open(test_file, 'rU'), delimiter='\t') 
for row in csv_file: 
    if row['GT'] == "0/1": 
     genotype = row['GT'] 
     if next is not None: 
      if next == "0/1": 
       position = int(row['pos']) 
       if last is not None: 
        print (position - last) 
       last = position 
     next = genotype 

, когда я запускаю его на data.tsv (см ниже) он делает то, что предполагает, чтобы сделать, что для печати 80. В столбце GT, 0/1 происходит после того, как 0/1 один раз, а 832398-832318 = 80

pos GT 
815069 0/0 
825069 0/1 
825410 ./. 
830181 1/1 
832318 0/1 
832398 0/1 
832756 0/0 

Однако, когда я установил

если рядом == "0/0": (-> если первая GT = 0/1 и далее GT = 0/0, напечатайте разницу bewteen соответствующие значения в столбце pos, что составляет 832756-832398 = 358)

ничего не печатает! Также при изменении

if next == "./."

он ничего не делает

import csv 

next=None 
last = None 
test_file = 'data.tsv' 
csv_file = csv.DictReader(open(test_file, 'rU'), delimiter='\t') 
for row in csv_file: 
    if row['GT'] == "0/1": 
     genotype = row['GT'] 
     if next is not None: 
      **if next == "0/0":** 
       position = int(row['pos']) 
       if last is not None: 
        print (position - last) 
       last = position 
     next = genotype 

Любые идеи, почему это может быть? Благодарен за любую помощь! Дайте мне знать, если я должен уточнить описание проблемы (начинающий Python)

С уважением Джоанну

ответ

1

в первом сценарии переменная next сбивает с толку, на самом деле это не следующий, но в настоящее время GT. Скрипт работает только случайно, потому что оба GT равны (поэтому порядок не имеет значения).

Как вы итерации своей строки файла построчно едва ли можно смотреть вперед, вместо того, чтобы вы могли оглянуться назад и сравнить текущий GT с последним GT, как это:

import csv 

last_gt = None 
last_pos = None 
test_file = 'data.tsv' 
csv_file = csv.DictReader(open(test_file, 'rU'), delimiter='\t') 
    for row in csv_file: 
     curr_gt = row['GT'] 
     curr_pos = int(row['pos']) 
     if (curr_gt == "0/0") and (last_gt == "0/1"): # EDIT: 'and' instead of '&' 
      print(curr_pos - last_pos) 
     last_pos = curr_pos       # EDIT: delete 'else' statement 
     last_gt = curr_gt 
+1

Я думаю, что это в основном право ответ. Я не уверен в блоке 'else', возможно, значения' last_whatever' должны быть безоговорочно обновлены в конце цикла. Кроме того, вы должны использовать оператор 'and', а не' & 'в условии' if'. Последний делает поразрядное - и, как это бывает, получается в этой ситуации хорошо, поскольку оба аргумента - 'bool', но могут работать неправильно в других контекстах. Например, выражение '1 и 2' равно' 2' (что является правдивым), но '1 & 2' -' 0' (ложь). – Blckknght

+0

Спасибо @Blckknght за пояснительный комментарий. Я думаю, что это хороший момент, поэтому я отредактирую свой ответ. – Benjamin

Смежные вопросы