создание вложенного словаря для перебора моих текстовых файлов и папок для создания словаря с несколькими ключами

#python #loops #dictionary #text #bigdata

#python #циклы #словарь #текст #bigdata

Вопрос:

У меня есть counts.txt файлы в 50 папках, каждая из которых относится к одному образцу. В counts.txt : первый — это строка, а другой — число. Я пытаюсь создать вложенный словарь с их помощью. Цель состоит в том, чтобы использовать первый столбец counts.txt и папки в качестве ключа словаря и второго столбца в counts.txt в качестве значения. К сожалению, список папок, который я хочу создать по ним, чтобы придать мне правильную форму, не работает и сталкивается с проблемой!

 import os
from natsort import natsorted
path1 = "/home/ali/Desktop/SAMPLES/"


data_ali={}
samples_name=natsorted(os.listdir(path1))


data_ali = {}

samples_name=natsorted(os.listdir(path1))
for i in samples_name:    
    with open(path1 i[0:] "/counts.txt","rt") as fin:    
        for l in fin.readlines():    
            l=l.strip().split()    
            if l[0][:4]=='ENSG':    
                gene=l[0]    
                data_ali[gene]={}       
                reads=int(l[1])    
                data_ali[gene][samples_name]=reads
print(data_ali)




i expect the output like this: 
'ENSG00000120659': {
    'Sample_1-Leish_011_v2': 14,
    'Sample_2-leish_011_v3': 7,
    'Sample_3-leish_012_v2': 6,
    'Sample_4-leish_012_v3': 1,
    'Sample_5-leish_015_v2': 9,
    'Sample_6-leish_015_v3': 3,
    'Sample_7-leish_016_v2': 4,
    'Sample_8-leish_016_v3': 8,
    'Sample_9-leish_017_v2': 8,
    'Sample_10-leish_017_v3': 2,
    'Sample_11-leish_018_v2': 4,
    'Sample_12-leish_018_v3': 4,
    'Sample_13-leish_019_v2': 7,
    'Sample_14-leish_019_v3': 4,
    'Sample_15-leish_021_v2': 12,
    'Sample_16-leish_021_v3': 5,
    'Sample_17-leish_022_v2': 4,
    'Sample_18-leish_022_v3': 2,
    'Sample_19-leish_023_v2': 9,
    'Sample_20-leish_023_v3': 6,
    'Sample_21-leish_024_v2': 22,
    'Sample_22-leish_024_v3': 10,
    'Sample_23-leish026_v2': 9,
    'Sample_24-leish026_v3': 5,
    'Sample_25-leish027_v2': 4,
    'Sample_26-leish027_v3': 1,
    'Sample_27-leish028_v2': 7,
    'Sample_28-leish028_v3': 5,
    'Sample_29-leish032_v2': 8,
    'Sample_30-leish032_v3': 2
     }
  

Ответ №1:

Попробуйте это:

         if l[0][:4] == 'ENSG':
            gene = l[0]
            reads = int(l[1])
            data_ali.setdefault(gene, {})[i] = reads
  

Два важных изменения:

  1. Ваш код data_ali[gene]={} всегда очищал то, что было ранее, и вместо этого создавал новый пустой словарь. setdefault словарь создается только в том случае, gene если ключ еще не присутствует.
  2. Вторым ключом должен быть i , а не список samples_name .

Полная очистка кода:

 import os
from natsort import natsorted

root = "/home/ali/Desktop/SAMPLES/"

data_ali = {}

for sample_name in natsorted(os.listdir(root)):
    with open(os.path.join(root, sample_name, "counts.txt"), "r") as fin:
        for line in fin.readlines():
            gene, reads = line.split()
            reads = int(reads)
            if gene.startswith('ENSG'):
                data_ali.setdefault(gene, {})[sample_name] = reads

print(data_ali)