Путаница с оператором if / else в Python

1


Как вы можете создать оператор if else в python, когда у вас есть файл с текстом и цифрами.
Скажем, я хочу заменить значения из третьего в последний столбец в файле ниже. Я хочу создать оператор if else для замены значений <5 или если есть точка "." с нулем и, если возможно, использовать это значение как целое для суммы.
Быстрое и грязное решение с использованием awk будет выглядеть так, но мне интересно, как обрабатывать данные этого типа с помощью python:

 awk -F"[ :]" '{if ( (!/^#/) && ($9<5 || $9==".") ) $9="0" ; print }'

Итак, как вы решаете эту проблему?
Спасибо

Входной файл:

\##Comment1
\#Header
sample1 1   2   3   4   1:0:2:1:.:3
sample2 1   4   3   5   1:3:2:.:3:3
sample3 2   4   6   7   .:0:6:5:4:0



Желаемый результат:

\##Comment1
\#Header
sample1 1   2   3   4   1:0:2:0:0:3
sample2 1   4   3   5   1:3:2:0:3:3
sample3 2   4   6   7   .:0:6:5:4:0
SUM = 5


Результат до сих пор

['sample1', '1', '2', '3', '4', '1', '0', '2', '0', '0', '3\n']
['sample2', '1', '4', '3', '5', '1', '3', '2', '0', '3', '3\n']
['sample3', '2', '4', '6', '7', '.', '0', '6', '5', '4', '0']


Вот что я пробовал до сих пор:

import re

data=open("inputfile.txt", 'r')
for line in data:
    if not line.startswith("#"):
        nodots = line.replace(":.",":0") 
        final_nodots=re.split('\t|:',nodots)
        if (int(final_nodots[8]))<5:
            final_nodots[8]="0"
            print (final_nodots)
        else:
            print(final_nodots)
  • 0
    Какова сумма 5 в вашем примере?
  • 5
    Спасибо за то, что вы опубликовали свои усилия и ваш вклад и результаты желаний, но ваш вопрос не очень ясен, как вы преобразовали свой вклад в результаты своих желаний? Почему 1 перешел на 0 и . во втором примере повернуть в 0 но первый образец не?
Показать ещё 2 комментария
Теги:
if-statement

1 ответ

0
data=open("inputfile.txt", 'r')

import re
sums = 0
for line in data:
    if not line.startswith("#"):
        nodots = line.replace(".","0") 
        final_nodots=list(re.findall('\d:.+\d+',nodots)[0])
        if (int(final_nodots[6]))<5:
            final_nodots[6]="0"
        print(final_nodots)
        sums += int(final_nodots[6])
print(sums)

Вы были довольно близки, но вы, ваши final_nodots, получили раскол : вместо разделения на первые несколько чисел, поэтому ваш 8 должен был быть 3. После этого просто добавьте счетчик sums чтобы отслеживать этот слот.

['sample1 1   2   3   4   1', '0', '2', '0', '0', '3\n']

Есть лучшие способы добиться того, чего вы хотите, но я просто хотел исправить ваш код.

  • 0
    Я очень ценю это, и спасибо за исправление. Глядя на новый вывод, мы потеряли имена образцов и дополнительные столбцы. Так как же нам сохранить эту информацию?
  • 0
    @LuckyBadger извините, прежде чем я зарегистрировался, я не заметил, что вставил неправильный код. Обновлен с вашим кодом и регулярным выражением с незначительным изменением индекса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню