import lasio
import os
l = lasio.read(os.path.join("..", "tests", "examples", "6038187_v1.2_short.las"))
The information in a LAS file's header is all parsed and available through the sections of the header.
So to start at the top and view the ~Version section:
l.version
[HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - VERSION 2.0, original_mnemonic=VERS), HeaderItem(mnemonic=WRAP, unit=, value=NO, descr=ONE LINE PER DEPTH STEP, original_mnemonic=WRAP)]
each item here is a HeaderItem, which is a kind of attribute dictionary - very easy to use either through items or attributes:
l.version.VERS
HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - VERSION 2.0, original_mnemonic=VERS)
l.version['VERS']
HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - VERSION 2.0, original_mnemonic=VERS)
l.well
[HeaderItem(mnemonic=STRT, unit=M, value=0.05, descr=FIRST INDEX VALUE, original_mnemonic=STRT), HeaderItem(mnemonic=STOP, unit=M, value=136.6, descr=LAST INDEX VALUE, original_mnemonic=STOP), HeaderItem(mnemonic=STEP, unit=M, value=0.05, descr=STEP, original_mnemonic=STEP), HeaderItem(mnemonic=NULL, unit=, value=-99999, descr=NULL VALUE, original_mnemonic=NULL), HeaderItem(mnemonic=COMP, unit=, value=, descr=COMP, original_mnemonic=COMP), HeaderItem(mnemonic=WELL, unit=, value=Scorpio E1, descr=WELL, original_mnemonic=WELL), HeaderItem(mnemonic=FLD, unit=, value=, descr=, original_mnemonic=FLD), HeaderItem(mnemonic=LOC, unit=, value=Mt Eba, descr=LOC, original_mnemonic=LOC), HeaderItem(mnemonic=SRVC, unit=, value=, descr=, original_mnemonic=SRVC), HeaderItem(mnemonic=CTRY, unit=, value=, descr=, original_mnemonic=CTRY), HeaderItem(mnemonic=STAT, unit=, value=SA, descr=STAT, original_mnemonic=STAT), HeaderItem(mnemonic=CNTY, unit=, value=, descr=, original_mnemonic=CNTY), HeaderItem(mnemonic=DATE, unit=, value=15/03/2015, descr=DATE, original_mnemonic=DATE), HeaderItem(mnemonic=UWI, unit=, value=6038-187, descr=WUNT, original_mnemonic=UWI)]
Let's say we'd like to add some information about the country this log was taken in.
We can do it easily by directly assigning the values:
l.well.CTRY = 'Australia'
l.well.CTRY
HeaderItem(mnemonic=CTRY, unit=, value=Australia, descr=, original_mnemonic=CTRY)
Now let's have a look at the curves
l.curves
[CurveItem(mnemonic=DEPT, unit=M, value=, descr=DEPTH, original_mnemonic=DEPT, data.shape=(121L,)), CurveItem(mnemonic=CALI, unit=MM, value=, descr=CALI, original_mnemonic=CALI, data.shape=(121L,)), CurveItem(mnemonic=DFAR, unit=G/CM3, value=, descr=DFAR, original_mnemonic=DFAR, data.shape=(121L,)), CurveItem(mnemonic=DNEAR, unit=G/CM3, value=, descr=DNEAR, original_mnemonic=DNEAR, data.shape=(121L,)), CurveItem(mnemonic=GAMN, unit=GAPI, value=, descr=GAMN, original_mnemonic=GAMN, data.shape=(121L,)), CurveItem(mnemonic=NEUT, unit=CPS, value=, descr=NEUT, original_mnemonic=NEUT, data.shape=(121L,)), CurveItem(mnemonic=PR, unit=OHM/M, value=, descr=PR, original_mnemonic=PR, data.shape=(121L,)), CurveItem(mnemonic=SP, unit=MV, value=, descr=SP, original_mnemonic=SP, data.shape=(121L,)), CurveItem(mnemonic=COND, unit=MS/M, value=, descr=COND, original_mnemonic=COND, data.shape=(121L,))]
Notice the units for PR are incorrect - to change that access the unit attribute directly:
l.curves.PR.unit = 'ohmm'
l.curves.PR
CurveItem(mnemonic=PR, unit=ohmm, value=, descr=PR, original_mnemonic=PR, data.shape=(121L,))
And finally the Parameter section:
l.params
[HeaderItem(mnemonic=BS, unit=, value=216 mm, descr=BS, original_mnemonic=BS), HeaderItem(mnemonic=JOBN, unit=, value=, descr=JOBN, original_mnemonic=JOBN), HeaderItem(mnemonic=WPMT, unit=, value=, descr=WPMT, original_mnemonic=WPMT), HeaderItem(mnemonic=AGL, unit=, value=, descr=AGL, original_mnemonic=AGL), HeaderItem(mnemonic=PURP, unit=, value=Cased hole stratigraphy, descr=PURP, original_mnemonic=PURP), HeaderItem(mnemonic=X, unit=, value=560160, descr=X, original_mnemonic=X), HeaderItem(mnemonic=CSGL, unit=, value=0 m - 135 m, descr=CSGL, original_mnemonic=CSGL), HeaderItem(mnemonic=UNIT, unit=, value=, descr=UNIT, original_mnemonic=UNIT), HeaderItem(mnemonic=Y, unit=, value=6686430, descr=Y, original_mnemonic=Y), HeaderItem(mnemonic=TDL, unit=, value=135.2 m, descr=TDL, original_mnemonic=TDL), HeaderItem(mnemonic=PROD, unit=, value=, descr=PROD, original_mnemonic=PROD), HeaderItem(mnemonic=MUD, unit=, value=Water, descr=MUD, original_mnemonic=MUD), HeaderItem(mnemonic=CSGS, unit=, value=100 mm, descr=CSGS, original_mnemonic=CSGS), HeaderItem(mnemonic=ENG, unit=, value=, descr=ENG, original_mnemonic=ENG), HeaderItem(mnemonic=STEP, unit=, value=5 cm, descr=STEP, original_mnemonic=STEP), HeaderItem(mnemonic=FluidLevel, unit=, value=54 m, descr=FluidLevel, original_mnemonic=FluidLevel), HeaderItem(mnemonic=CSGT, unit=, value=PVC, descr=CSGT, original_mnemonic=CSGT), HeaderItem(mnemonic=WIT, unit=, value=, descr=WIT, original_mnemonic=WIT), HeaderItem(mnemonic=EREF, unit=, value=, descr=EREF, original_mnemonic=EREF), HeaderItem(mnemonic=PROJ, unit=, value=, descr=PROJ, original_mnemonic=PROJ), HeaderItem(mnemonic=ZONE, unit=, value=53J, descr=ZONE, original_mnemonic=ZONE), HeaderItem(mnemonic=DREF, unit=, value=GL, descr=DREF, original_mnemonic=DREF), HeaderItem(mnemonic=TDD, unit=, value=136 m, descr=TDD, original_mnemonic=TDD)]
If you'd prefer to see a section as a dictionary you can with the dictview()
method:
l.params.dictview()
{'AGL': '', 'BS': '216 mm', 'CSGL': '0 m - 135 m', 'CSGS': '100 mm', 'CSGT': 'PVC', 'DREF': 'GL', 'ENG': '', 'EREF': '', 'FluidLevel': '54 m', 'JOBN': '', 'MUD': 'Water', 'PROD': '', 'PROJ': '', 'PURP': 'Cased hole stratigraphy', 'STEP': '5 cm', 'TDD': '136 m', 'TDL': '135.2 m', 'UNIT': '', 'WIT': '', 'WPMT': '', 'X': 560160, 'Y': 6686430, 'ZONE': '53J'}