这里展示使用代码批量读取成组数据的多个文件并自动整理。

前面使用 ImageJ 保存了 tif 文件和对应的 ROI记录,并且按照{name}.tif{name}s.zip 的命名规则分别对 tif 文件和 ROI 记录文件做好了命名。有了规范文件命名的前提,接下来我们就可以很轻松地批量地成组地读取数据。

from glob import glob 

imgs = glob("*.tif")
rois = glob("*s.zip")

# imgs[:3]
# rois[:3]

上面一段代码使用 glob 模块,支持通配符匹配文件名,返回的是一个列表。我们可以对列表进行切片,查看文件名是不是匹配的。注意 glob 所得列表,默认似乎是按照文件名来自动排序的。

如上图所示,其实 name 也可以有简单的规则,这里我使用了 - 来连接不同的信息块,其实遵循的是 {cell}-{group}-{image_id} 这种方式,最左边的是最大的范围,最右边的是这张图的数据编号。基于这种简单的命名规范,我们才能够实现轻松的文件整理。

box = []
for img, roi in zip(imgs, rois):
    if roi==img.replace(".tif", "s.zip"):
        name = img.split(".")[0]
        cell, gp, idx = name.split("-")
        item = {'cell':cell, 
                'group':gp,
                'img_id':idx,
                'img_fp':img,
                'roi_fp':roi
                }
        box.append(item)
    else:
        print(img)

这段代码浓缩了不少精华。罗列如下:

  • 通过 zip 来组合多个可迭代的 列表,这里就是 imgs 和rois,方便遍历
  • 判断两个列表中的 img 和 roi 是否是一一匹配的,防止有些时候顺序不对造成的出错
  • img 和 roi 都是字符串,可以. 来分割字符串,返回的是一个列表,前半部分是 name,后半部分是文件名后缀。所以在使用文件名中的连接符的时候,我绝对不会使用 .,而尽量使用下划线_ 或者 -
  • 然后每一最小单元组的多个文件和数据,我都新建了一个字典 item 来装载这种多元化的信息,字典好处多多,后面再详聊。
  • 字典装好了,就用 box 这个列表收集起来。这样就完成了数据的整理。

整理好的信息最好要随时保存,这里我推荐使用 pickle 模块来干这个事情:

import pickle

with open('data.pkl', 'wb') as f:
    pickle.dump(box, f)

如果是要读取这种临时保存的中间数据和信息文件,代码如下:

with open('data.pkl', 'rb') as f:
    data = pickle.load(f)
最后修改:2024 年 09 月 05 日
请大力赞赏以支持本站持续运行!