Skip to main content

一个解析DLIS文件的python库

项目描述

介绍

DLIS 文件解析器(数字测井交换标准),测井数据的二进制格式,由RP66 版本 1描述

范围

此解析器可以处理 RP66 版本 1 的可见包络和逻辑格式,这意味着只要它是最终位于计算机/服务器上的 DLIS 文件,此解析器应该能够读取和解析它。但是,它是在磁盘磁带中,这个解析器将无法解析它。标准中定义的大多数格式已被覆盖,例如

  • 单个 DLIS 文件中的逻辑文件和多个逻辑文件
  • EFLR(公共 EFLR 和私有 EFLR)和 IFLR(FData、EoF 和 NOFORM IFLR)
  • 多维FData
  • 此解析器对加密的 DLIS 文件的支持有限。例如,它只能从逻辑记录段中读取生产者的公司代码。也无法读取加密的 FData
  • 目前此解析器仅支持 RP66 版本 1,版本 2 超出范围,因为它没有被积极使用。
  • 目前只支持读取DLIS文件,不支持写入或更新

安装

现在我们还没有在https://pypi.org托管这个解析器,但你仍然可以通过以下方式将它安装为本地包pip install

  • 确保你有 python 3.5+
  • (可选)使用 python 3.5+ 创建一个 virtualenv
  • 转到此存储库的父文件夹,然后安装软件包pip install -e dlispy

如何使用

下面是一段代码片段,演示了如何使用它的 API:

将其用作命令行工具

将其安装为软件包后,您可以使用以下命令转换单个 DLIS 文件或包含 DLIS 文件的文件夹: python -m dlispy.core --input=<path to single dlis file or a folder> --output=<output path> --eflronly=<if True only dump EFPRs, otherwise dump everything>

输出

当使用这个解析器解析一些 dlis 文件并生成输出时,在指定的输出目录中,您可以期望原始 dlis 文件中的每个逻辑文件都有一个文件夹。在每个逻辑文件夹中,包括以下部分:

  • 一个名为的目录UnformattedDataLogicalRecords,其中包括所有未格式化的数据逻辑记录。对于每条记录,有两部分,二进制数据文件和描述其的 json 文件CONSUMER-NAMEDESCRIPTION
  • 一个 json 文件,代表逻辑文件中的所有 EFLR
  • 一组 CSV 文件,每个文件代表一帧的所有 FData。注意:通道的值可以是单个整数、浮点整数列表或多维体积。解析总是将高维 volumen 压缩到 1 维列表,例如维度为 [320, 6] 的通道值将被压缩到长度为 1920 (320x6) 的列表。得到这样的列表后,您可以回顾 csv 文件以找出维度并恢复到其高维度表示。

如何解析dlis文件并遍历逻辑记录:

from dlispy import LogicalFile, Object, Attribute, FrameData, PrivateEncryptedEFLR, parse
# you can also set eflrOnly as True to only load EFLRs
_, logical_file_list = parse('../data/206_05a-_3_DWL_DWL_WIRE_258276498.DLIS', eflr_only= False) 
for lf  in logical_file_list: # type:LogicalFile
    print("LogicalFile with ID:{}, SequenceNumber:{}".format(lf.id, lf.seqNum))
    for eflr in lf.eflrList:
        if type(eflr) is PrivateEncryptedEFLR:              # PrivateEncryptedEFLR needs to handle separately.
            continue
        print("     Set with Type:{}, Name:{}".format(eflr.setType, eflr.setName))
        for obj in eflr.objects: # type:Object
            print("             Object with Name:{}".format(obj.name))
            for attribute in obj.attributes:    #type:Attribute
                print("                     Attribute with Label:{}, Value:{}, Count:{}, RepCode:{}, Units:{} ".
                      format(attribute.label, ' '.join(map(str, attribute.value)) 
                      if type(attribute.value) is list else attribute.value, 
                      attribute.count, attribute.repCode, attribute.units))

    for frameName, fDataList in lf.frameDataDict.items():
        print("     Frame:{}".format(frameName))
        for fdata in fDataList: # type:FrameData
            print("             FrameData with FrameNumber:{} and {} of slots".
            format(fdata.frameNumber, len(fdata.slots)))

如何将 dlis 文件转储为可读格式

在此示例代码中,您可以看到如何将 dlis 文件转储为读取格式,包括。由于每个 dlis 文件可以包含一个或多个逻辑文件,因此逻辑记录跨逻辑文件之间没有依赖关系,因此这意味着单独处理每个逻辑文件,因此我们在给定的输出路径中为每个逻辑文件创建单独的文件夹,我们id使用逻辑文件作为文件夹名称。在每个文件夹中,有以下内容:

  • 一个 json 文件,其中包含此逻辑文件中的所有 EFLR(公共和私有 oens)
  • 一组 csv 文件,每个文件代表一个帧。文件的命名约定是<origin of ObjectName>_<copy of ObjectName>_<identifier of ObjectName>.csv. 在 csv 文件中,每一列代表一个通道,每一行代表一个 FrameData。对于高维通道,该值被压缩为一维数组,用户可以使用 json 文件中的通道维度属性将其转换回来。
  • 一个名为 的文件夹UnformattedDataLogicalRecords,所有的Unformatted Data LogicalRecords都以二进制格式存储在这个文件夹中。
from dlispy import dump
# you can also set eflrOnly as True to only dump the EFLRs as json file load EFLRs
dump('../data/206_05a-_3_DWL_DWL_WIRE_258276498.DLIS', output_path='output', eflr_only= False)

提前使用

在此示例代码中,您将看到如何在特定类型的 EFLR 中查找有关特定对象的信息。

from dlispy import LogicalFile, Object, Attribute, FrameData, PrivateEncryptedEFLR, parse
from dlispy import OlrEFLR, FrameEFLR
from dlispy import Frame, FrameData, Origin
# you can also set eflrOnly as True to only load EFLRs
_, logical_file_list = parse('../../data/206_05a-_3_DWL_DWL_WIRE_258276498.DLIS')
for lf  in logical_file_list: # type:LogicalFile
    for eflr in lf.eflrList:
        if type(eflr) is OlrEFLR:
            for obj in eflr.objects: #type:Origin
                print("File {} created by company {} at {}".format(
                    obj.getAttrValue(Origin.FILE_ID),obj.getAttrValue(Origin.COMPANY),obj.getAttrValue(Origin.CREATION_TIME)))

        if type(eflr) is FrameEFLR:
            for obj in eflr.objects: #type:Frame
                chanel_names = ', '.join(map(str, obj.getAttrValue(Frame.CHANNELS)))
                print("Frame {} with channel list {}".format(obj.name, chanel_names))

附加提示:

不同Python版本的兼容性测试:

  • 安装工具:pip install tox pytest pyenv
  • 然后确保您安装了 python 3.5、3.6
  • tox

生成覆盖率报告:

py.test --cov-report html --cov=dlis_parser dlis_parser/tests/test_basic.py

生成文档:

  • 安装狮身人面像:brew install sphinx-doc
  • 删除.rstindex.rstdocs 文件夹中的旧文件
  • 重新生成.rst文件源代码: cd docs;sphinx-apidoc -o . ../dlis_parser ../dlis_parser/tests/*; cd ..
  • 生成 HTML 文档:cd docs;make clean html
  • docs/_build/html然后你可以在目录中找到文档

执照

该项目在BSD-3-Clause下获得许可

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

dlispy-0.0.2.tar.gz (23.8 kB 查看哈希)

已上传 source

内置分布

dlispy-0.0.2-py3-none-any.whl (32.1 kB 查看哈希

已上传 py3