在科学数据结构之间进行转换的工具

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,它应该运行与本例中相同的内容:

^{pr2}$

如果当前文件/文件夹与正则表达式不匹配,则跳过此文件。如果元组为空,则正则表达式默认为通配符(.)。在

dastr.read()返回attrspathlistpath指定实际文件的路径,而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,它是strlist,指定文件的新位置(尽管它们尚未从原来的位置删除):

/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是{},它使用Python的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采用以下三种方式之一进行格式化:

  1. 一个listdicts
[{"pattern":"p(.+)","attrs":"participant ID"},{"pattern":"(.+)\.edf",		"attrs": "session"}]
  1. {cd6}
{"patterns":["p(.+)","(.+)\.edf"	],	"attrs": [		"participantID",		"session"]}
  1. 一个lists和strlist
["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是行不通的。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为游戏添加声音。需要帮助   java在获取数据时忽略模型类中的forign键映射   java为什么Microsoft JDBC驱动程序忽略failoverPartner主机名   java可以下载mozswing文件   java等价于ObjectOutputStream,不仅保存其状态,还保存整个对象?   Java Android LiveData根据其他LiveData调用房间查询   java如何使用jackson jsonNode实现这一点并获得所需的输出   在web服务器上作为web应用程序运行java应用程序?   groovy中java类的元类属性   返回空指针的java图形对象   标头中包含用户名和密码的java SOAP客户端请求   具有堆栈实现和递归的Hanoi算法塔(Java)   java当我运行这两个类时,我的老鼠不会移动   使用图像进行java相似图像搜索   Java8并行流机制   使用单例对象作为枚举元素的java Scala枚举,是否有可能对它们进行迭代?   java Webview更改高度大小   不可序列化对象和函数的java Spark Scala编程   java my app在eclipse中运行良好,而不是在jar中