Соедините файлы с помощью Python

У меня есть папка с несколькими файлами .tif, которые я хотел бы соединить для выполнения некоторых функций внутри цикла for.

Например:

smp001_GFP.tif

smp001_mCherry.tif (это должна быть пара)

smp002_GFP.tif

smp002_mCherry.tif (это другая пара)

Я хотел бы, чтобы цикл for перебирал каждую пару и выполнял некоторые функции. Например:

**for** pair **in** folder:
         img_GFP=cv2.imread(pair.__contains__("GFP"))
         img_mCherry=cv2.imread(pair.__contains__("mCherry"))

Мне сказали, что я могу соединить файлы с помощью словарей, но какую стратегию вы порекомендуете для этого?

Спасибо!

Как насчет того, чтобы объединить все те, которые заканчиваются на _GFP.tif, а затем заменить GFP на mCherry, чтобы найти друга каждого?

Mark Setchell 08.01.2023 18:59

То, как вы это сделаете, зависит от «правил». Файлы «соединены» преамбулой с «_» (например, smp001) и имеют тип tif?

Pingu 08.01.2023 20:24

это не обработка изображений. Я удалил тег. это обработка имен файлов.

Christoph Rackwitz 08.01.2023 22:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Некоторая дополнительная информация/код была бы полезна, но чтобы дать общее представление, вы можете создать словарь, а затем просмотреть имена файлов и создать новый ключ для каждой пронумерованной пары. По сути:

pairs_dict = {}
for file_name in folder:
    # Get the prefix for the pair
    # assuming the filename format 'smp000_...'
    key = file_name.split('_')[0] # grabs 'smpXXX'
    # Then create a key in our dictionary for it. 
    pairs_dict[key] = []
...
for pair_prefix in list(pairs_dict.keys()):
    # 'get_file()' being whatever function the module 
    # you use has for grabbing files by name
    img_GFP = get_file(pair_prefix + '_GFP.tif')
    img_mCherry = get_file(pair_prefix + '_mCherry.tif')

Вложенные словари будут работать хорошо. Ключи внешнего словаря 001, 002 и т. д. будут отображаться во внутренние словари, которые содержат элементы {"GFP":filename, "mCherry:filename}. Если вы используете defaultdict для внешнего словаря, он автоматически создаст внутренние словари на первый доступ Используйте регулярное выражение, чтобы получить идентификаторы из строки.

import re
from collections import defaultdict
import os

tif_name_re = re.compile(r"smp(\d+)_(GFP|mCherry)\.tif")
tif_map = defaultdict(dict)

for name in os.listdir("some/directory"):
    m = tif_name_re.match(name)
    if m:
        tif_map[m.group(1)][m.group(2)] = m.group(0)

for key,value in tif_map.items():
    print(key, value)

Выход

001 {'GFP': 'smp001_GFP.tif', 'mCherry': 'smp001_mCherry.tif'}
002 {'GFP': 'smp002_GFP.tif', 'mCherry': 'smp002_mCherry.tif'}
Ответ принят как подходящий

Вот другой взгляд. Давайте предположим, что части имен файлов GFP и mCherry не имеют значения, но на самом деле общая часть — это та часть, которая предшествует символу подчеркивания.

Если это так, то:

from glob import glob
from os.path import basename, join

DIRECTORY = './tifs' # directory contains the tif files
result = dict()
 
for filename in sorted(map(basename, glob(join(DIRECTORY, '*.tif')))):
    key, _ = filename.split('_')
    result.setdefault(key, []).append(filename)

print(result)

Выход:

{'smp002': ['smp002_mCherry.tif', 'smp002_GFP.tif'], 'smp001': ['smp001_mCherry.tif', 'smp001_GFP.tif']}

Это дает нам словарь с ключом в преамбуле и «пары» в виде списка для каждого ключа.

Другие вопросы по теме