open geotiff with gdal produces AttributeError: __exit__
open geotiff with gdal produces AttributeError: __exit__
我有一张光栅图像,想用 gdal 打开它以获取有关投影的一些信息。
使用以下代码打开工作正常:
from osgeo import gdal
gtiff = gdal.Open(filename)
prj = gtiff.GetProjection()
# do some work
但是,以下方法不起作用:
with gdal.Open(filename) as gtiff:
prj = gtiff.GetProjection()
而是显示属性错误:
AttributeError: __exit__
我认为后者通常被认为是更好的风格。我正在使用 Python 3.4.5 :: Continuum Analytics, Inc. (anaconda)。
Python 的许多范例都依赖于 "magic methods"。例如,对 len(x)
的调用会调用 x.__len__()
。 >
或 >=
等等式也使用双下划线的魔术方法。
Python 的 with X as x
范式依赖于两个魔术方法:X.__enter__
和 X.__exit__
。 gdal.Open
返回的class是一个gdal.Dataset
,没有这些方法。因此,在使用您提供的 with as
语句时会抛出错误。
打开和关闭 gdal.Dataset
的正确方法是:
import gdal
ds = gdal.Open('filename.tif', gdal.GA_Update)
# do something
del ds
删除 Dataset
将确保将更改写入文件。您还可以通过 运行 ds.FlushCache()
编写这些更改
我有一张光栅图像,想用 gdal 打开它以获取有关投影的一些信息。
使用以下代码打开工作正常:
from osgeo import gdal
gtiff = gdal.Open(filename)
prj = gtiff.GetProjection()
# do some work
但是,以下方法不起作用:
with gdal.Open(filename) as gtiff:
prj = gtiff.GetProjection()
而是显示属性错误:
AttributeError: __exit__
我认为后者通常被认为是更好的风格。我正在使用 Python 3.4.5 :: Continuum Analytics, Inc. (anaconda)。
Python 的许多范例都依赖于 "magic methods"。例如,对 len(x)
的调用会调用 x.__len__()
。 >
或 >=
等等式也使用双下划线的魔术方法。
Python 的 with X as x
范式依赖于两个魔术方法:X.__enter__
和 X.__exit__
。 gdal.Open
返回的class是一个gdal.Dataset
,没有这些方法。因此,在使用您提供的 with as
语句时会抛出错误。
打开和关闭 gdal.Dataset
的正确方法是:
import gdal
ds = gdal.Open('filename.tif', gdal.GA_Update)
# do something
del ds
删除 Dataset
将确保将更改写入文件。您还可以通过 运行 ds.FlushCache()