felim
felim

Reputation: 103

open geotiff with gdal produces AttributeError: __exit__

I have a raster image and would like to open it with gdal to pull some information about the projection.

Opening with the following code works fine:

from osgeo import gdal
gtiff = gdal.Open(filename)
prj = gtiff.GetProjection()
# do some work

However, the following doesn't work:

with gdal.Open(filename) as gtiff:
    prj = gtiff.GetProjection()

Instead an attribute error is displayed:

AttributeError: __exit__

I thought the latter is commonly accepted as better style. I'm using Python 3.4.5 :: Continuum Analytics, Inc. (anaconda).

Upvotes: 3

Views: 656

Answers (1)

Logan Byers
Logan Byers

Reputation: 1573

Python relies on "magic methods" for many of its paradigms. The call to len(x), for instance, calls x.__len__(). Equalities like > or >= also use magic methods that are double-underscored.

The with X as x paradigm of Python relies on two magic methods: X.__enter__ and X.__exit__. The class returned by gdal.Open is a gdal.Dataset, which does not have these methods. It therefore throws an error when using a with as statement like you provided.

The proper way to open and close a gdal.Dataset is:

import gdal
ds = gdal.Open('filename.tif', gdal.GA_Update)
# do something
del ds

Deleting the Dataset will ensure that changes were written to the file. You can also write those changes by running ds.FlushCache()

Doc about Python's with as statements

Python's special methods

Upvotes: 2

Related Questions