关于 dlisio
dlisio 是用于读取二进制 RP66 DLIS 和 LIS79 数据的 Python 库,可提取结构化数组与元数据,面向测井数据处理。它不写入 DLIS;附带工具可将选定的标量曲线导出为 LAS,并明确处理深度与有损转换问题。
主要功能
- 01读取 DLIS 与 LIS79 文件
- 02检查逻辑文件和数据帧
- 03提取标量及数组通道
- 04保留通道元数据与维度
- 05受控导出标量曲线为 LAS
适用场景
- 01检查多逻辑文件测井数据
- 02读取具有重复名称的通道
- 03将深度曲线和测量曲线导出为 LAS
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill dlisio安装后在 Claude Code 中输入/dlisio确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/dlis_structure.mdframe_channels.mdscripts/dlis_to_las.py详细介绍
DLIS/LIS 读取与受控 LAS 导出
使用 dlisio 读取二进制 RP66 DLIS 和 LIS79 输入。它会返回结构化 NumPy 数组和元数据对象;它不会写入 DLIS。LAS 使用 lasio。
选择逻辑文件和帧
选择数据前先检查物理文件。逻辑文件和帧可能具有不同的深度、采样率和通道标识。dlis.load() 返回的是 PhysicalFile 上下文管理器,而不是生成器。在上下文中读取数组数据,然后保留复制后的数组或 DataFrame,以便在关闭上下文后继续使用。
from dlisio import dlis
def inventory(path):
items = []
with dlis.load(str(path)) as files:
for logical_index, logical in enumerate(files):
for frame_index, frame in enumerate(logical.frames):
items.append({
'logical_file': logical_index, 'frame': frame_index,
'fingerprint': frame.fingerprint,
'index_type': frame.index_type, 'index': frame.index,
'channels': [(ch.fingerprint, ch.units, ch.dimension)
for ch in frame.channels],
})
return items
通道标识包括类型、助记符、来源和副本编号。仅凭名称不一定唯一。使用 channel.fingerprint 访问其数组字段;即使名称经过消歧,frame.curves() 也会将指纹用作 dtype 标题。
FRAMENO 字段记录帧序号,而不是测量深度。
读取标量和数组通道
from dlisio import dlis
import pandas as pd
def read_frame(path, logical_file_index=0, frame_index=0):
with dlis.load(str(path)) as files:
if not 0 <= logical_file_index < len(files):
raise ValueError('Logical file index out of range')
logical = files[logical_file_index]
if not 0 <= frame_index < len(logical.frames):
raise ValueError('Frame index out of range')
frame = logical.frames[frame_index]
records = frame.curves()
scalar = {name: records[name].copy() for name in records.dtype.names
if records[name].ndim == 1}
arrays = {ch.fingerprint: records[ch.fingerprint].copy()
for ch in frame.channels if records[ch.fingerprint].ndim > 1}
metadata = {'frame': frame.fingerprint, 'index_type': frame.index_type,
'index': frame.index,
'channels': {ch.fingerprint: {'name': ch.name, 'units': ch.units,
'dimension': ch.dimension} for ch in frame.channels}}
return pd.DataFrame(scalar), arrays, metadata
将数组/图像通道保留为数组,保留所有尾部维度。结构化数组具有 dtype.names,而不是 .items()。包含多维字段时,直接转换为 DataFrame 会失败。除非有明确要求并记录在案的归约方法,否则不要将图像通道求平均并转换为标量。
深度、缺失值与转换
- 在将索引声明为深度之前,先检查
frame.index_type和第一个通道的单位。时间通道或FRAMENO不能替代深度。 - 保留深度递增或递减的顺序。重复/非单调深度需要明确处理;不要悄悄对不同趟次排序或重采样。
- DLIS 没有通用的 LAS 式空值哨兵。保留 NaN,仅在含义有文档记录时应用厂商空值标记。导出时保留掩码。
阅读帧和通道处理,了解标识、搜索和单独的无损数组导出。阅读文件结构和 LIS,了解元数据、编码和单独的 LIS API。
随附的 DLIS 到 LAS 辅助工具始终会优先包含经过验证的深度曲线,即使 --curves 只请求测量值。它接受唯一助记符或完整指纹,保留 m/ft 单位和深度顺序,并在采样不规则时写入 STEP=0。默认情况下会排除数组并给出诊断信息;若明确请求数组,则会报错,而不会将其丢弃。LAS 无法无损表示 DLIS 元数据和多维样本。
python scripts/dlis_to_las.py well.dlis --list
python scripts/dlis_to_las.py well.dlis scalar.las --logical-file 0 --frame 0 --curves GR
请相对于此已安装技能目录解析脚本路径。对于非深度索引的帧,必须显式指定 --depth-channel。支持导出的深度单位为 m 和 ft;其他单位需要有文档记录的转换方式。--null-value 用于记录操作者选择的已知厂商哨兵值。
验证范围
已使用 dlisio 1.0.4 和项目生成的二进制 DLIS 文件进行检查,涵盖多个逻辑文件/帧、重复助记符、标量/数组通道、NaN 和 LAS 往返转换。这些合成文件归项目所有,并未重新分发任何现场日志。LIS、损坏文件恢复和厂商专用记录需要各自的测试样本;不要声称 DLIS 测试覆盖了这些分支。
官方 DLIS API,检查日期为 2026-09-14。除非有明确记录的恢复决策足以说明放宽严格解析的合理性,否则请使用严格解析;不得将错误报告为成功但内容为空的导出。