У меня есть папка с несколькими файлами .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"))
Мне сказали, что я могу соединить файлы с помощью словарей, но какую стратегию вы порекомендуете для этого?
Спасибо!
То, как вы это сделаете, зависит от «правил». Файлы «соединены» преамбулой с «_» (например, smp001) и имеют тип tif?
это не обработка изображений. Я удалил тег. это обработка имен файлов.
Некоторая дополнительная информация/код была бы полезна, но чтобы дать общее представление, вы можете создать словарь, а затем просмотреть имена файлов и создать новый ключ для каждой пронумерованной пары. По сути:
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']}
Это дает нам словарь с ключом в преамбуле и «пары» в виде списка для каждого ключа.
Как насчет того, чтобы объединить все те, которые заканчиваются на
_GFP.tif
, а затем заменитьGFP
наmCherry
, чтобы найти друга каждого?