0

我正在尝试从 VCF 文件中提取位置和 SNP。到目前为止,我已经写了以下内容。但是如何更改字典的名称,以便每个输入文件都有一个字典呢?

即:python vcf_compare.py file1.vcf file2.vcf file3.vcf

import sys

import vcf

for variants in sys.argv[1:]:
    file1 = {} 
    vcf_reader = vcf.Reader(open(variants))
    for record in vcf_reader:
        pos = record.POS
        alt = record.ALT
        ref= record.REF
        snps[pos]=ref,alt

所以为 argv[1] 创建了一个名为 file1 的字典。如何使字典名称更改为例如文件二以进行循环的第二次迭代?

4

2 回答 2

1

您应该使用collections.defaultdict并且还使用with open(...)

from collections import defaultdict

files = defaultdict(dict)
for filename in sys.argv[1:]:
    with open(filename) as f:
        vcf_reader = vcf.Reader(f)
        for record in vcf_reader:
            files[filename][record.POS] = record.REF, record.ALT

所有这些漂亮的 Python 技巧使代码更具可读性,更短,使用更少的中间临时变量。此外,使用with open()确保每个文件在被读取后自动关闭。

此外,如您所见,您可以选择更好的变量名称,并大大减少代码行数。

于 2017-03-30T21:38:15.480 回答
1

简短的回答:你不能。对于许多早期的程序员来说,这是一个令人难以置信的令人沮丧的事实。修复:另一本字典!在你的variantsfor 循环之外,创建另一个字典并使用文件名作为键。示例(你不能只是复制粘贴这个,因为我不知道如何使用 vcf 库):

import sys

import vcf

all_files = {}
for variants in sys.argv[1:]:
    #didn't see file1 used, and didn't see snps created
    #so figured file1 was snps...
    snps = {} 
    vcf_reader = vcf.Reader(open(variants))
    for record in vcf_reader:
        pos = record.POS
        alt = record.ALT
        ref= record.REF
        snps[pos]=ref,alt
    all_files[variants] = snps

我在这里假设这variants是一个字符串形式的文件名。如果不是,请将variantsin替换为all_files[variants]您要用作其键的字符串。

于 2017-03-30T21:42:25.137 回答