首页 > 解决方案 > 如何使用python在目录中分配键和值

问题描述

我想将 Illumina 对端读数与参考基因组进行映射。我有一个目录,我只需要使用以paired_R1.fastq.gz 和paired_R2.fastq.gz 结尾的文件进行配对读取。

我正在创建一个脚本,其中paired_R1 是键,paired_R2 是值;但是,我在 for 循环中分配键和值时遇到了困难。我知道 file1 和 file2 没有定义,但我不知道如何将“endswith”的输出分别设置为键和值。

if __name__ == '__main__':
    path = os.getcwd()
    dir_files = os.listdir(path)
    pair_reads = {}
    for file in dir_files:
        if file.endswith("_paired_R1.fastq.gz"):
            file = file1
            if file.endswith("_paired_R2.fastq.gz"):
                file = file2
                pair_reads[file1] = file2
    print(pair_reads)

先感谢您!

标签: pythondictionary

解决方案


我可以看到你的逻辑。只有几个问题:

  • file = file1,应该是file1 = file(对于 file2 相同)
  • 这两个条件语句相互矛盾,因此它们应该在相同的缩进处,否则永远不会执行
  • dir_files需要对要关联的正确文件进行排序,以sorted(dir_files)确保这一点。
if __name__=='__main__':
    path = os.getcwd()
    dir_files = os.listdir(path)
    pair_reads = {}
    for file in sorted(dir_files):
        if file.endswith("_paired_R1.fastq.gz"):
            file1 = file
        if file.endswith("_paired_R2.fastq.gz"):
            file2 = file
            pair_reads[file1] = file2 
    print(pair_reads)

只要目录结构满足每次读取只有一个文件R1和一个文件,这应该可以正常工作。R2

编辑:另一种方式,使用列表推导:

if __name__=='__main__':
    path = os.getcwd()
    dir_files = sorted(os.listdir(path))
    R1s = [f for f in dir_files if f.endswith("_paired_R1.fastq.gz")]
    R2s = [f for f in dir_files if f.endswith("_paired_R2.fastq.gz")]
    pair_reads = dict(zip(R1s, R2s))
    print(pair_reads)

推荐阅读