Составьте разделенный пробелами список выбранных символов в имени файла - PullRequest
1 голос
/ 08 января 2020

У меня есть набор файлов в каталоге с такими именами, как:

"34_R1.fastq", "100_R1.fastq", "100_R2.fastq", "EF23_R1.fastq"

, и я хочу сделать разделенный пробелами список символов перед первым подчеркиванием, без дубликатов. Мой желаемый вывод только с файлами выше будет "34 100 EF23".

Я написал скрипт python, чтобы начать этот процесс, но я заметил, что вывод неправильный. Очевидно, что есть дубликаты, потому что я еще не написал код для их обработки, но это потому, что я не могу получить выходные данные для правильного разделения числовых / буквенных символов c перед подчеркиванием. Любые мысли о том, как мой код неверен?

# In directory with all files
import os
import re

file1 = open("RIL_list.txt", "a")

for filename in os.listdir("."):
    m = re.split("_", filename)[0]
    file1.writelines(' '.join(m))

file1.close()

Вывод неправильный, используя этот код, так как числа и буквы c разделяются в процессе. В итоге я получу file1, содержащий что-то вроде "34 1 00 10 0E F2 3" сверху.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Вот как реализовать предложение @ aws_apprentice (которое не требует использования регулярных выражений):

import os


dir_path = "./test_dir"
matches = set()

for filename in os.listdir(dir_path):
    sep = filename.split("_")
    if len(sep) > 1:
        matches.add(sep[0])  # Add characters preceding first "_".

if matches:
    with open("RIL_list.txt", "w") as file1:
        file1.write(' '.join(matches) + '\n')

Содержимое выходного файла будет следующим для примеров файлов, которые у вас есть в вашем вопросе:

EF23 34 100

Обновление

Вы можете делать вещи более объектно-ориентированным и лаконичным способом, используя модуль pathlib вместо модуля os.

from pathlib import Path


matches = set()

for filepath in Path("./test_dir").iterdir():
    sep = filepath.stem.split("_")
    if len(sep) > 1:
        matches.add(sep[0])  # Add characters preceding first "_".

if matches:
    Path("RIL_list.txt").write_text(" ".join(matches) + '\n')
0 голосов
/ 08 января 2020

Лично я бы использовал для этого регулярное выражение. Это может быть излишним, но будет чрезвычайно удобно, если вам нужно будет внести какие-либо изменения в те части строки, которые вы извлекаете.

import re

patt = re.compile(r"(.+)_")

file_names = ["34_R1.fastq", "100_R1.fastq", "100_R2.fastq", "EF23_R1.fastq"]

matches = set()

for f_name in file_names:
    match_res = patt.match(f_name)
    if match_res:
        matches.add(match_res.group(1))

with open('../out/temp_out.txt', 'w') as out_file:
    out_file.write(' '.join(matches))

Содержимое 'temp_out.txt' после выполнения:

EF23 34 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...