È possibile recuperare le dimensioni di uno shapefile usando Python e Arcpy? Se é cosi, come?
È possibile recuperare le dimensioni di uno shapefile usando Python e Arcpy? Se é cosi, come?
Risposte:
Scorrere tutti i file nella directory dello shapefile con un'estensione dello shapefile valida e sommare le loro dimensioni. Il os
modulo è utile per questa attività. Ecco una funzione che restituisce la dimensione di tutti i file shapefile associati a uno shapefile di input in byte. Usa il percorso completo del file di forma come input.
import os
def ShpSize (inShp):
#standardize lowercase
inShp = inShp.lower ()
#shapefile extensions
extensions = [".shp",
".shx",
".dbf",
".sbn",
".sbx",
".fbn",
".fbx",
".ain",
".aih",
".atx",
".ixs",
".mxs",
".prj",
".xml",
".cpg"]
#shape file name without directory
shpName = os.path.basename (inShp)
#shape file name without .shp extension
shpFlName = os.path.splitext(shpName)[0]
#size set to zero
size = 0
#directory of shapefile
shpDir = os.path.dirname (inShp)
#iterate directory files
for fl in os.listdir (shpDir):
#standardize lowercase
fl = fl.lower ()
#skip file names that don't match shapefile
flName = os.path.splitext(fl)[0]
if not flName == shpFlName:
#special case: .shp.xml file
if not fl == shpFlName + ".shp.xml":
continue
#skip file names without proper extension
ext = os.path.splitext(fl)[1]
if not ext in extensions:
continue
#get size
flFullPath = os.path.join (shpDir, fl)
size += os.path.getsize (flFullPath)
return size
shpDir
, è possibile utilizzare glob.glob(shpFlName + "*")
solo per restituire file con lo stesso nome di base. Quindi è solo un filtro su estensioni valide.
glob
è nativo, sì?
È possibile utilizzare un'espressione del generatore per trovare in modo efficiente la dimensione del file di forma (ovvero includendo tutti i file associati). Il seguente metodo utilizza la funzionalità Python 2.7 integrata.
import os, glob
ws = r'C:\path\to\your\shapefiles' # input workspace
shapefiles = glob.glob(os.path.join(ws, "*.shp")) # List all .shp files
for shapefile in shapefiles:
s = sum([os.stat(x).st_size for x in glob.glob(shapefile.split(".")[0] + "*")])
print "The file size for %s is %s bytes or %s kb" % (shapefile, s, (float(s)/1000))
L'espressione del generatore procede come segue:
glob
con il percorso e il carattere jolly *
per elencare tutti i file associatios.stat
sum([...])
.