Komle
A python library for WITSML
Install / Use
/learn @kle043/KomleREADME
komle
komle, a python library for WITSML, uses PyXB to marshal/unmarshal xml files according to the schemas.
Some of the features are:
- WITSML data model bindings for schema v1.4.1.1 and v2.0
- Note just one version can be used in the same runtime, due to namespace collision
- WITSML to dict, for use in a pandas dataframe or json
- Unit converter based on witsmlUnitDict
- Soap client to request data from a witsml server, according to the webservice description
- Validation that xml files conforms to the WITSML schema
- Support for the generated write schemas, to be used for WMLS_AddToStore
- Note that write_bindings can not be imported at the same time as read_bindings. See below for details.
Install
pip3 install git+ssh://git@github.com/kle043/komle.git
Or if the repo is cloned
pip3 install -U .
Getting started
from komle.bindings.v1411.read import witsml
from komle import utils as ku
import pandas as pd # Not part of komle setup
with open('log.xml', 'r') as log_file:
# logs is a regular python object according to the witsml schema
logs = witsml.CreateFromDocument(log_file.read())
# Print the witsml documentation for logs
print(logs._element().documentation())
# Print the schema location for logCurveInfo, nice to have for reference
print(logs.log[0].logCurveInfo[0]._element().xsdLocation().locationBase)
print([l.name for l in logs.log])
# Convert logdata to a dict
log = logs.log[0]
data_dict = ku.logdata_dict(log)
# Create a dataframe, if you have installed pandas
df_data = pd.DataFrame(data_dict)
# Do the same for the plural logCurveInfo element
df_curve = pd.DataFrame(ku.plural_dict(log.logCurveInfo))
witsml.CreateFromDocument works on any witsml object, like trajectorys, mudLogs, tubulars etc, and returns a python representation according to
the schema. Nodes are converted to there corresponding python types and accessed like any other python object, the exception is leaf nodes with attributes where one must call value() since primitive types in python does not have custom attributes. For example mdTop.value() where mdTop also has the attribute mdTop.uom, also see examples/hello_witsml.py.
Usage of different schemas
The difference between the schemas is described here. In summary,
- Read Schemas: [...] a copy of the normative files except that all choices, elements and attributes are optional. [...] these schema files must represent the XMLout response from the WITSML WMLS_GetFromStore method.
- Write Schemas: [...] a copy of the normative files except that some unique identifier attributes have had their optionality changed. [...] these schema files must represent the XMLin input to the WITSML WMLS_AddToStore method.
- Update Schemas (not currently supported): [...] a copy of the normative files with all elements and attributes optional except that all unique identifier attributes and uom attributes are mandatory. [...] these schema files must represent the XMLin input to the WITSML WMLS_UpdateInStore method.
- Delete Schemas (not currently supported): [...] a copy of the normative files with all elements and attributes optional except for all object uids and parentage-pointers which are mandatory. [...] these schema files must represent the QueryIn input to the WITSML WMLS_DeleteFromStore method.
As a practical matter, any program needing to work on both read and write (and update/delete) should only import the read bindings, since they have the least restrictions. The read bindings will be valid also for write/update/delete, as long as the mandatory elements and attributes are present. For validation of the write schema, a separate test program which only imports the write bindings must be used. (Note that the multiprocessing module can not easily be used for this purpose, since the child processes will inherit the parent process' imports.)
Related Skills
node-connect
350.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
109.9kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
109.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
350.1kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
