DMO 炮孔数据库文件
dimine_python_sdk.lib.io 提供 DmoFile 类用于读写 Dimine 炮孔数据库文件(.dmo)。DMO 本质上是带固定表头(炮孔数据库标准字段,新版 26 列)的 DMT 数据表文件,API 将其映射为 pandas.DataFrame,加载时对表头做宽松校验(缺列/多列/类型不符只记录告警、不抛异常),保存时按固定表头还原字段类型,避免 pandas dtype 推断丢失 long/binary 等类型。
一、加载与保存
从文件加载
from dimine_python_sdk.lib.io import DmoFile
dmo = DmoFile("炮孔数据库-data.dmo")
print(dmo.columns) # 26 列标准字段
print(dmo.record_count) # 炮孔数量
print(dmo.data.head())
print(dmo.header_warnings) # 表头非标准告警(如有)
保存到文件
dmo.data.loc[0, "孔径"] = 250.0
dmo.save("output.dmo") # 另存为新文件(无扩展名时自动追加 .dmo)
dmo.save() # 覆盖原文件
从 DataFrame 创建并保存
import pandas as pd
from dimine_python_sdk.lib.io import DmoFile
df = pd.DataFrame({
"爆破区域": ["M01", "M01"],
"炮孔编号": ["BH-01", "BH-02"],
"孔径": [220.0, 220.0],
"孔深": [12.0, 13.5],
})
DmoFile(data=df).save("new.dmo")
上下文管理器
from dimine_python_sdk.lib.io import dmo_conn
with dmo_conn("炮孔数据库.dmo") as dmo:
print(dmo.info)
dmo.data["孔径"] = dmo.data["孔径"] * 1.1
dmo.save()
二、固定表头 schema
DMO 文件拥有固定的 26 列标准字段,定义于模块常量 DMO_FIELD_SCHEMA:
from dimine_python_sdk.lib.io import DMO_FIELD_NAMES, DMO_FIELD_TYPES
print(DMO_FIELD_NAMES) # 字段名列表(26 项)
print(DMO_FIELD_TYPES) # {'爆破区域': 'string', '炮孔Handle': 'long', ...}
dmo.schema # [{"name": "爆破区域", "type": "string"}, ...]
字段类型支持 string / long / int / double / binary。标准字段覆盖:
- 标识:
爆破区域、炮孔编号、虚拟炮孔、起爆点炮孔、炮孔Handle - 起爆参数:
起爆延时、所属爆堆、地表起爆时间、孔内起爆时间、孔内分段起爆 - 孔口/孔底坐标:
孔口坐标X/Y/Z、孔底坐标X/Y/Z - 孔参数:
孔径、孔深、方位角、倾角 - 装药参数:
装药半径相对孔径的收缩比例、装药重量、装药长度、单耗面积、装药结构、连线信息
三、表头宽松校验
加载时 DmoFile 会对表头做宽松校验,非标准列或缺列不会抛异常,而是记录到 header_warnings:
dmo = DmoFile("旧版炮孔数据.dmo")
for w in dmo.header_warnings:
print(w)
# 缺少标准列: ['孔内分段起爆', '连线信息']
# 含非标准列: ['孔内延时']
# 字段 '炮孔Handle' 类型不符: 期望 long, 实际 double
校验规则: - 缺标准列:记录告警,缺失列在 DataFrame 中不存在 - 含非标准列:记录告警,非标准列在保存时按 pandas dtype 回退推断类型 - 类型不符:记录告警,保存时仍按 schema 中的标准类型还原
dmo.info 在继承 DmtFile 摘要信息的基础上,额外附带 header_warnings。
四、数据访问
DmoFile 继承 DmtFile,拥有完整的数据表操作接口:
dmo.name # "炮孔数据库" — 文件名(不含扩展名)
dmo.columns # 字段名列表
dmo.shape # (行数, 列数)
dmo.record_count # 炮孔行数
dmo.empty # 是否为空
# DataFrame 访问
df = dmo.data # 内部 DataFrame 引用(修改会影响 dmo)
df = dmo.to_dataframe() # 独立副本
# 行操作
row = dmo.get_record(0) # 单行字典
dmo.set_value(0, "孔径", 250.0) # 设置单元格
dmo.add_record({"炮孔编号": "BH-03"}) # 追加一行,返回新索引
# 列访问
dmo["孔径"] # 整列列表
"孔径" in dmo # True
更完整的数据访问说明见 DMT 数据表文件。
五、异常处理
from dimine_python_sdk.lib.io import DmoError, DmoLoadError, DmoSaveError
try:
dmo = DmoFile("not_exist.dmo")
except DmoLoadError as e:
print(f"加载失败: {e}")
try:
dmo = DmoFile()
dmo.save() # 未指定路径
except DmoSaveError as e:
print(f"保存失败: {e}")
异常层次:
- DmoError(RuntimeError) — 基类
- DmoLoadError(DmoError) — 加载失败
- DmoSaveError(DmoError) — 保存失败
参考链接
- DMT 数据表文件 — 基础数据表访问接口
- API 参考:dmo_file