Как определить отступы в al oop в python - PullRequest
0 голосов
/ 08 января 2020

Это пример того, как выглядит мой каталог:

> SSSRRR2.bam               SSSRRR24.bam     
> 
> SSSRRR2.bam.bai           SSSRRR24.bam.bai
> 
> SSSRRR2.split.bam         SSSRRR24.split.bam
> 
> SSSRRR2.ump.fastq         SSSRRR24.ump.fastq

Единственные файлы, которые мне нужны, это .split.bam и .bam файлы для каждого идентификатора, чтобы применить subprocess.check_output. Это сценарий python, который я сделал:

#!/usr/bin/env python

import os
import subprocess


if __name__=='__main__':
    path = os.getcwd()
    dir_files = os.listdir(path)
    pair_reads = {}


    for file in sorted(dir_files):
        if file.endswith(".split.bam"):
            ID_1 = file.split(".")[0]
            file1 = file

        if file.endswith(".bam") and not file.endswith(".split.bam") and not file.endswith(".bam.bai"):
            ID_2 = file.split(".")[0]
            file2 = file

        if ID_1 == ID_2:
             pair_reads[file1] = file2

    for key, value in pair_reads.items():
#        print(key)
        name = key.split(".")[0]
        subprocess.check_output("tepid-discover -k -d -i --strict -D -p 36 -n " + name + " -c " + key + " s " + value, shell  = True)

Однако моя проблема заключается в отступе, когда я применяю циклы. Если каждый блок if не зависит друг от друга, как я могу установить соединение с обоими, например, в этом блоке:

if ID_1 == ID_2:
    pair_reads[file1] = file2

Это ошибка, которую я получил:

if ID_1 == ID_2:
NameError: name 'ID_1' is not defined

Дополнительно, я использую python2, потому что программа работает с python2.
Заранее благодарю за помощь. Надеюсь, я ясно дал понять.

Ответы [ 2 ]

0 голосов
/ 08 января 2020

В одной итерации вашего l oop может быть определен только один из ID_1 и ID_2, поскольку он просматривает только один файл за раз, и два условия являются взаимоисключающими.

Существует два простых решения этой проблемы: вы можете задать значения по умолчанию ID_1 и ID_2 или добавить другое условие, прежде чем проверять, что они одинаковы (например, «если оба идентификатора были определены и * 1008»). * они одинаковы ").

Однако это может не заставить вашу программу работать, поскольку os.listdir может перечислять файлы в другом порядке, чем вы ожидаете.

Самое простое решение может быть просто посмотреть только файлы .split.bam или .bam и создать другой файл самостоятельно.

import os

for file in os.listdir(path):
    # separate the last two file extensions from the base name
    basename, *extensions = file.rsplit(os.extsep, 2)
    if extensions == ['split', 'bam'] and basename:
        # found basename.split.bam
        bamfile = basename + '.bam'
        if os.path.exists(bamfile):
            # use basename, bamfile, and file however you want
            subprocess.check_output(...)

Это находит каждый файл .split.bam и проверяет, соответствующий файл .bam существует до запуска последней строки.

0 голосов
/ 08 января 2020

Похоже, это не имеет ничего общего с отступом. Ваша программа не запускает первый оператор if. Я не знаю, что вы хотите сделать, но вы можете поместить это сравнение во что-то вроде

try: 
    ID_1 and ID_2
except:
    print("qwe")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...