首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中定义循环中的缩进

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

Stack Overflow用户
提问于 2020-01-08 00:07:04
回答 2查看 50关注 0票数 0

下面是我的目录的一个示例:

代码语言:javascript
复制
> 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_output。这是我编写的python脚本:

代码语言:javascript
复制
#!/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的每个块是相互独立的,那么如何将连接引入到这两个块,例如在这个块中:

代码语言:javascript
复制
if ID_1 == ID_2:
    pair_reads[file1] = file2

这就是我遇到的错误:

代码语言:javascript
复制
if ID_1 == ID_2:
NameError: name 'ID_1' is not defined

另外,我使用的是python2,因为该程序与python2一起工作。

提前谢谢你的帮助。我希望我说得很清楚。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-08 01:11:14

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

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

但是,这可能无法使您的程序工作,因为os.listdir可能以与您预期不同的顺序列出文件。

最简单的解决方案可能是只查看.split.bam文件或.bam文件,然后自己构建另一个文件。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-01-08 00:28:26

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

代码语言:javascript
复制
try: 
    ID_1 and ID_2
except:
    print("qwe")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59637808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档