这里展示使用代码批量读取成组数据的多个文件并自动整理。
前面使用 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)
此处评论已关闭