如何在python中定义循环中的缩进

2024-05-16 17:53:38 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的目录的示例:

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

我需要的唯一文件是每个ID的.split.bam.bam文件,以便应用subprocess.check\u输出。这是我编写的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一起工作。
提前感谢您的帮助。我希望我说清楚了


Tags: keynameidifosfilesplitsubprocess
2条回答

在循环的一次迭代中,只能定义ID_1ID_2中的一个,因为它一次只查看一个文件,并且这两个条件是互斥的

这个问题有两个简单的解决方案:您可以给出ID_1ID_2默认值,或者您可以在检查它们是否相同之前添加另一个条件(例如,“如果两个ID都定义了,那么它们是相同的”)

但是,这可能无法使程序正常工作,因为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文件是否存在

这似乎与缩进无关。您的程序没有运行第一个if语句。我不知道你想做什么,但是你可以把这个比较嵌套在

try: 
    ID_1 and ID_2
except:
    print("qwe")

相关问题 更多 >