Регулярное выражение Python для строки и сопоставления их в диктонну - PullRequest
0 голосов
/ 30 января 2019

У меня есть три файла в каталоге, и я хотел, чтобы они были сопоставлены со списком строк в словаре.

Файлы в dir выглядят следующим образом,

DB_ABC_2_T_bR_r1_v1_0_S1_R1_001_MM_1.faq.gz
DB_ABC_2_T_bR_r1_v1_0_S1_R2_001_MM_1.faq.gz
DB_DEF_S1_001_MM_R1.faq.gz
DB_DEF_S1_001_MM_R2.faq.gz

В list есть часть имени файла, как,

ABC
DEF

Так вот что япопробовал,

import os
import re

dir='/user/home/files'
list='/user/home/list'
samp1     = {}
samp2     = {}

FH_sample = open(list, 'r')
for line in FH_sample:
    samp1[line.strip().split('\n')[0]] =[]
    samp2[line.strip().split('\n')[0]] =[]
FH_sample.close()
for file in os.listdir(dir):
    m1 =re.search('(.*)_R1', file)
    m2 = re.search('(.*)_R2', file)
    if m1 and m1.group(1) in samp1:
        samp1[m1.group(1)].append(file)
    if m2 and m2.group(1) in samp2:
        samp2[m2.group(1)].append(file)

Я хотел, чтобы вышеуказанный скрипт нашел совпадения из m1 и m2 и собрал их в словарях samp1 и samp2.Но приведенный выше скрипт не находит совпадения, в пределах if loop.Теперь samp1 и samp2 пусты.

Вот как должен выглядеть вывод для samp1 и samp2:

{'ABC': [DB_ABC_2_T_bR_r1_v1_0_S1_R1_001_MM_1.faq.gz, DB_ABC_2_T_bR_r1_v1_0_S1_R2_001_MM_1.faq.gz], 'DEF': [DB_DEF_S1_001_MM_R1.faq.gz, DB_DEF_S1_001_MM_R2.faq.gz]} 

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вы можете передать скрипту python команду dict и предоставить id_list, а затем добавить id_list в качестве ключей dict и добавить fastqs, если ключ dict указан в файле fastq_filename:

import os
import sys

dir_path = sys.argv[1]

fastqs=[]
for x in os.listdir(dir_path):
    if x.endswith(".faq.gz"):
        fastqs.append(x)

id_list = ['MOHUA', 'MSJLF']

sample_dict = dict((sample,[]) for sample in id_list)
print(sample_dict)
for k in sample_dict:
    for z in fastqs:
        if k in z:
            sample_dict[k].append(z)

print(sample_dict)

для запуска:

python3.6 fq_finder.py /path/to/fastqs

вывод сверху, чтобы показать, что происходит:

{'MOHUA': [], 'MSJLF': []} # first print creates dict with empty list as vals for keys
{'MOHUA': ['BSSE_QGF_1987_HJUS_1_MOHUA_2_T_bR_r1_v1_0_S1_R1_001_MM_1.faq.gz', 'BSSE_QGF_1967_HJUS_1_MOHUA_2_T_bR_r1_v1_0_S1_R2_001_MM_1.faq.gz'], 'MSJLF': ['BSSE_QGF_18565_H33HLAFXY_1_MSJLF_T_bulk_RNA_S1_R2_001_MM_1.faq.gz', 'BSSE_QGF_18565_H33HLAFXY_1_MSJLF_T_bulk_RNA_S1_R1_001_MM_1.faq.gz']}
0 голосов
/ 30 января 2019

Большая часть этого кода вам, вероятно, не нужна.Вы можете просто увидеть, что подстрока, которая у вас есть от list, равна in dir.

Код ниже читает данные в виде списков.Похоже, вы уже сделали это, так что просто нужно заменить files именами файлов, которые вы читаете из dir, и заменить st на подстроки из list (которые вы не должны использоватькак имя переменной, так как оно фактически используется для чего-то еще в Python).

files = ["BSSE_QGF_1987_HJUS_1_MOHUA_2_T_bR_r1_v1_0_S1_R1_001_MM_1.faq.gz",
         "BSSE_QGF_1967_HJUS_1_MOHUA_2_T_bR_r1_v1_0_S1_R2_001_MM_1.faq.gz",
         "BSSE_QGF_18565_H33HLAFXY_1_MSJLF_T_bulk_RNA_S1_R1_001_MM_1.faq.gz",
         "BSSE_QGF_18565_H33HLAFXY_1_MSJLF_T_bulk_RNA_S1_R2_001_MM_1.faq.gz"]
my_strings = ["MOHUA", "MSJLF"]

res = {s: [] for s in my_strings}
for k in my_strings:
    for file in files:
        if k in file:
            res[k].append(file)
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...