[FWTools] edit shapefile attributes with Python
Bryan Keith
bryan at geomega.com
Tue Aug 15 16:36:37 EDT 2006
Frank Warmerdam wrote:
> Bryan Keith wrote:
>> Hello,
>>
>> I'm simply trying to edit the attributes of a shapefile with Python. I
>> have no trouble creating a new shapefile, creating new features, and
>> adding them to the shapefile. However, now I just want to edit
>> attributes of the dbf. Here's my simple script:
>>
>> import ogr
>> #get the stream
>> ogrdriver = ogr.GetDriverByName("ESRI Shapefile")
>> dsRiver = ogrdriver.Open("test_py.shp")
>> mRiverLayer = dsRiver.GetLayerByName("test_py")
>> mFeature = mRiverLayer.GetFeature(0)
>> iIndex = mFeature.GetFieldIndex("RIVER_MILE")
>> mFeature.SetField(iIndex, 100.1)
>> mRiverLayer.SetFeature(mFeature)
>>
>> which gives me this error:
>>
>> ERROR 3: Error in fseek() or fwrite() writing object to .shp file.
>>
>> Is attribute updating supported in shapefiles? What am I doing wrong?
>> Thanks for the help.
>
> Brian,
>
> I'm not sure if this got answered already or not.
> Try opening the file in update mode.
>
> eg.
>
> import ogr
> > #get the stream
> > ogrdriver = ogr.GetDriverByName("ESRI Shapefile")
> > dsRiver = ogrdriver.Open("test_py.shp",1)
>
Frank,
Thanks. That's one of the things that I tried after posting my message.
It doesn't help, however. I no longer get the error message. The
.shp file has a new timestep, but the .dbf doesn't, and the attribute
didn't change.
Here's the simple code, and the ogrinfo output after running the code:
import ogr
ogrdriver = ogr.GetDriverByName("ESRI Shapefile")
dsRiver = ogrdriver.Open("test_py.shp", 1)
mRiverLayer = dsRiver.GetLayerByName("test_py")
mFeature = mRiverLayer.GetFeature(0)
iIndex = mFeature.GetFieldIndex("RIVER_MILE")
mFeature.SetField(iIndex, 100.1)
mRiverLayer.SetFeature(mFeature)
ogrinfo -sql "select RIVER_MILE from test_py" test_py.shp -al
INFO: Open of `test_py.shp'
using driver `ESRI Shapefile' successful.
Layer name: test_py
Geometry: Polygon
Feature Count: 1
Extent: (492238.723643, 664969.987499) - (526881.068923, 692475.373737)
Layer SRS WKT:
(unknown)
RIVER_MILE: Real (10.3)
OGRFeature(test_py):0
RIVER_MILE (Real) = -999.900
I also tried enclosing the edit in .StartTransaction() and
.CommitTransaction(), and I tried .SyncToDisk(), but those didn't help.
Bryan
More information about the FWTools
mailing list