在科学数据结构之间进行转换的工具
dastr的Python项目详细描述
达斯特
动机
开源数据集通常不是按照标准目录结构组织的。这意味着,如果您的分析代码需要特定的格式,您要么必须创建一个新版本,以不同的方式遍历文件,要么您必须手动移动并重命名文件,以匹配代码预期的格式。dastr
使后一种方法自动化。在
如何使用
dastr
可以通过pip(pip install dastr
)安装。在
目录结构之间的转换有三个步骤:(1)阅读,(2)翻译,和(3)写作。在
1。读数
通常会在数据集的文件夹和文件名中编码元数据。例如,可能每个参与者的数据都存储在一个单独的文件夹中,这些文件夹被称为“p01”、“p02”,等等。也许这是一个纵向的脑电图研究,在每个参与者特定的文件夹中都有一个名为“p01”、“p02”的文件预期违约概率“和”预计违约概率后". 在
dastr
使用正则表达式捕获(使用Python的re
库)将此数据读入一个表(一个list
,属于dict
),其中每一行(元素)是一个文件,每一列(键)是该文件的属性(例如,参与者ID和session)。在
要读入上述示例中的数据,请执行以下操作:
importdastrdata_path='/path/to/data/'files=dastr.read(path=data_path,params=[("p(.+)","participant ID"),("(.+)\.edf","session")],disp=True)
该函数将从path
参数指定的文件夹开始,然后从那里往下走。在目录结构的每一级执行的操作由params
参数的每个元素指定(元组的列表,其元素将是字符串)。每个元组的第一个元素将是一个正则表达式。如果正则表达式中有任何捕获,它们将被记录为元组的其余元素指定的属性。例如:上面的:("(.+)\.edf", "session")
意味着,一旦程序到达文件/path/to/data/p01/pre.edf
,它应该运行与本例中相同的内容:
如果当前文件/文件夹与正则表达式不匹配,则跳过此文件。如果元组为空,则正则表达式默认为通配符(.
)。在
dastr.read()
返回attrs
和path
的list
。path
指定实际文件的路径,而attrs
包含另一个存储属性的字典。一、 例如,在上面的例子中,files[0]["path"]
将是"/path/to/data/p01/pre.edf"
,而{disp=True
(或忽略此参数以不打印任何内容)。在
在某些情况下,这可能是你所需要的。您可以使用dastr.flatten()
来获得一个新的list
,其中的dict
具有从files[:]["attrs"]
复制的键值对,外加一个指定文件路径的附加键值对。这为来自Python的csv
库的DictWriter
提供了完美的输入。结果csv表可以由分析代码读入,指向每个数据文件,并将其输出作为新列。或者你不想改变你的分析代码。在
2。翻译
假设不是“pre”和“post”,而是将会话称为“01”和“02”。然后使用的函数是dastr.translate()
:
translation={"session":{"pre":"01","post":"02"}}translated=dastr.translate(files=files,translation=translation)original=dastr.translate(files=translated,translation=translation,direction="reverse")# Or equivalently "backward", or actually anything other than "forward"
3。写作
实际上移动文件与dastr.read()
非常相似。不同之处在于,不是在使用re
捕获时读取属性,而是使用字符串格式将它们写出。例如
new_path="/new/data/path/"destinations=dastr.write(files=files,path=new_pathparams=["alldata",("sub-%s","participant ID"),("sub-%s_ses-%s.edf","participant ID","session")])
创建变量destinations
,它是str
的list
,指定文件的新位置(尽管它们尚未从原来的位置删除):
/new/data/path/alldata/sub-01/sub-01_ses-01.edf
/new/data/path/alldata/sub-01/sub-01_ses-02.edf
/new/data/path/alldata/sub-02/sub-02_ses-01.edf
/new/data/path/alldata/sub-02/sub-02_ses-02.edf
如果确实要删除旧文件,可以添加可选参数key="x"
以使用Python的shutil.move()
(默认情况下,key
是{shutil.copy()
)。您还可以将key
设置为任何以old_path, new_path
为参数的函数,也可以将其设置为"n"
,它根本不接触文件(在w您可能还想设置disp=True
)。在
如何与JSON一起使用
为了避免硬编码参数和翻译,可以改为在.json文件中指定它们(感谢Gabi Herman的建议):
使用JSON
而不是跑步
dastr.[read/write](...,params=params,...)
你会跑的
dastr.[read/write](...,params=dastr.json_to_params("path/to/file.json"),...)
其中file.json
采用以下三种方式之一进行格式化:
- 一个
list
的dict
s
[{"pattern":"p(.+)","attrs":"participant ID"},{"pattern":"(.+)\.edf", "attrs": "session"}]
- {cd6}
{"patterns":["p(.+)","(.+)\.edf" ], "attrs": [ "participantID", "session"]}
- 一个
list
s和str
的list
["alldata",["sub-%s","participant ID"],["sub-%s_ses-%s.edf","participant ID","session"]]
使用JSON进行翻译
在这里,您只需将硬编码的translation
变量复制并粘贴到.json
文件中(用双引号替换单引号),并将此文件的位置传递给dastr.translate
:
translated=dastr.translate(...,translation="path/to/translation.json")
在这里运行dastr.json_to_params
是行不通的。在
- 项目
标签: