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