Basic example

>>> import lasio

You can use lasio.read() to open any file or URL. For this tutorial I will use the lasio.examples module to load a LAS file which is bundled with lasio:

>>> import lasio.examples
>>> las = lasio.examples.open("1001178549.las")

The lasio.read() function returns a lasio.LASFile object. Each of the standard LAS sections can be accessed as an attribute:

>>> las.version
[HeaderItem(mnemonic="VERS", unit=, value="2.0", descr="CWLS Log ASCII Standard -V...),
 HeaderItem(mnemonic="WRAP", unit=, value="YES", descr="Multiple lines per depth ...)]

Each LAS section is represented as a lasio.SectionItems object. The others, for LAS 2.0 files, are present as las.well, las.curves, and las.params; the ~O section is a string accessible at las.other.

You can also see the sections printed as an easier-to-read table:

>>> print(las.curves)
Mnemonic  Unit    Value         Description
--------  ----    -----         -----------
DEPT      FT      0   1  0  0   1 DEPTH
GSGR      API     31 310  0  0  2 GAMMA RAY
GSTK      API     31 797  0  0  3 ????????
GST       API     99 999 99  0  4 ????????
GSK       PERCNT  31 721  1  0  5 ????????
GSTH      PPM     31 790  0  0  6 THORIUM
GSUR      PPM     31 792  0  0  7 URANIUM
NCNPL     PERCNT  42 890  1  0  8 NEUTRON POROSITY (LIMESTONE)
DLDPL     PERCNT  43 890 10  0  9 DENSITY POROSITY (LIMESTONE)
DLDC      GM/CC   43 356  0  0  10 DENSITY CORRECTION
DLPE      B/E     43 358  0  0  11 PHOTO-ELECTRIC EFFECT
DLDN      GM/CC   43 350  0  0  12 BULK DENSITY
DLCL      INCHES  43 280  0  0  13 CALIPER
DLTN      LBS     43 635  0  0  14 ????????
IDGR      API     7 310  0  0   15 GAMMA RAY
ACCL1     INCHES  60 280  1  0  16 DENSITY CALIPER
ACCL2     INCHES  60 280  2  0  17 NEUTRON CALIPER
ACTC      US/FT   60 520  0  0  18 SONIC INTERVAL TRANSIT TIME (COMPENSATED)
ACAPL     PERCNT  60 890 20  0  19 POROSITY
IDIM      OHMM    7 120 44  0   20 MEDIUM INDUCTION
IDID      OHMM    7 120 46  0   21 DEEP INDUCTION
IDIDC     MMHOS   7 110 46  0   22 INDUCTION (CONDUCTIVITY UNITS)
IDL3      OHMM    7 220  3  0   23 FOCUSSED RESISTIVITY
IDTN      LBS     7 635  0  0   24 ????????
IDSP      MVOLT   7  10  0  0   25 SPONTANEOUS POTENTIAL
MEL1      OHMM    15 250  2  0  26 MICRO INVERSE 1"
ME        OHMM    15 252  2  0  27 MICRO NORMAL 2"

The data is present as a numpy.ndarray at las.data:

>>> las.data.shape
(5, 27)
>>> las.data
array([[1.7835000e+03,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan, 5.0646500e+01, 8.3871000e+00,
        8.4396000e+00, 5.5100000e+01, 5.6900000e-02, 5.6000000e+02,
        1.7500000e+02, 5.0000000e-02, 4.5330000e-01, 1.8930420e+03,
        9.2605000e+01,           nan,           nan],
       [1.7837500e+03,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan, 4.9676700e+01, 8.3951000e+00,
        8.4460000e+00, 5.4355500e+01, 5.9000000e-02, 5.6000000e+02,
        1.7500000e+02, 5.0000000e-02, 4.5340000e-01, 1.8523320e+03,
        9.2778000e+01,           nan,           nan],
       [1.7840000e+03,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan, 4.8631300e+01, 8.4052000e+00,
        8.4460000e+00, 5.4444400e+01, 5.8100000e-02, 5.6000000e+02,
        1.7500000e+02, 5.0000000e-02, 4.5370000e-01, 1.8319766e+03,
        9.2948200e+01,           nan,           nan],
       [1.7842500e+03,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan, 4.7771700e+01, 8.4173000e+00,
        8.4438000e+00, 5.5311100e+01, 5.7700000e-02, 5.6000000e+02,
        1.7500000e+02, 5.0000000e-02, 4.5380000e-01, 1.8319766e+03,
        9.3110300e+01,           nan,           nan],
       [1.7845000e+03,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan,           nan,           nan,
                  nan,           nan, 4.8114900e+01, 8.4253000e+00,
        8.4460000e+00, 5.6322200e+01, 5.8500000e-02, 5.6000000e+02,
        1.7500000e+02, 5.0000000e-02, 4.5390000e-01, 1.8116211e+03,
        9.3267100e+01,           nan,           nan]])

Although it might be easier for you to iterate over the curves:

>>> for curve in las.curves:
...     print(curve.mnemonic + ": " + str(curve.data))
DEPT: [1783.5  1783.75 1784.   1784.25 1784.5 ]
GSGR: [nan nan nan nan nan]
GSTK: [nan nan nan nan nan]
GST: [nan nan nan nan nan]
GSK: [nan nan nan nan nan]
GSTH: [nan nan nan nan nan]
GSUR: [nan nan nan nan nan]
NCNPL: [nan nan nan nan nan]
DLDPL: [nan nan nan nan nan]
DLDC: [nan nan nan nan nan]
DLPE: [nan nan nan nan nan]
DLDN: [nan nan nan nan nan]
DLCL: [nan nan nan nan nan]
DLTN: [nan nan nan nan nan]
IDGR: [50.6465 49.6767 48.6313 47.7717 48.1149]
ACCL1: [8.3871 8.3951 8.4052 8.4173 8.4253]
ACCL2: [8.4396 8.446  8.446  8.4438 8.446 ]
ACTC: [55.1    54.3555 54.4444 55.3111 56.3222]
ACAPL: [0.0569 0.059  0.0581 0.0577 0.0585]
IDIM: [560. 560. 560. 560. 560.]
IDID: [175. 175. 175. 175. 175.]
IDIDC: [0.05 0.05 0.05 0.05 0.05]
IDL3: [0.4533 0.4534 0.4537 0.4538 0.4539]
IDTN: [1893.042  1852.332  1831.9766 1831.9766 1811.6211]
IDSP: [92.605  92.778  92.9482 93.1103 93.2671]
MEL1: [nan nan nan nan nan]
ME: [nan nan nan nan nan]

The first curve in the LAS file – usually the depth – is present as las.index, and curves are also accessible from the LASFile object as items. For example:

>>> las.index
array([1783.5 , 1783.75, 1784.  , 1784.25, 1784.5 ])
>>> las["IDTN"]
array([1893.042 , 1852.332 , 1831.9766, 1831.9766, 1811.6211])