¿Recuperando el tamaño del shapefile en ArcPy?

10

¿Es posible recuperar el tamaño de un shapefile usando python y arcpy? ¿Si es así, cómo?

Juan
fuente
2
¿Te refieres a la cantidad de características? El área cubierta? El tamaño del archivo físico?
MaryBeth
Sí, el tamaño del archivo físico. Lo siento. Gracias @gene
John
@gene Otra pregunta tonta. os.path.getsize () devuelve un entero. Cuál es el valor predeterminado en KB?
John
1
1kB = 1024 bytes, divida los bytes por 1024 para obtener kilobytes (o eso era kibibytes, solo para confundir las cosas). Del mismo modo, hay 1024kB en un MB (MiB), 1024 MB en 1 GB (GiB). Tenga en cuenta que el tamaño de la forma no es todo el archivo de forma que hay DBF, SHX al menos y seguramente será mucho más: debe agregar todos esos archivos para obtener el tamaño verdadero en el disco.
Michael Stimson

Respuestas:

14

Itere a través de todos los archivos en el directorio de shapefile con una extensión de shapefile válida y agregue sus tamaños juntos. El osmódulo es útil para esta tarea. Aquí hay una función que devuelve el tamaño de todos los archivos shapefile asociados con un shapefile de entrada en bytes. Use la ruta completa del archivo de forma como su entrada.

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
Emil Brundage
fuente
66
En lugar de enumerar todos los archivos shpDir, puede usar glob.glob(shpFlName + "*")para devolver solo archivos que tengan el mismo nombre base. Entonces es solo un filtro en extensiones válidas.
Paul
Eso es cierto @Paul, glob es realmente útil, sin embargo, la solución de Emils es python nativa y absolutamente correcta. El método global solo debe ser una nota al margen ya que, en ciertas situaciones, los usuarios no pueden simplemente instalar software de terceros. Solo admitiría una respuesta que requiera una instalación de terceros si no hubiera una manera viable (o realista) de hacerlo en python nativo
Michael Stimson
@ MichaelMiles-Stimson globes nativo, ¿sí?
Emil Brundage
No creo que lo sea, lo tengo y lo uso con frecuencia, pero estoy casi seguro de que tuve que descargarlo. Lo puse en mi lista de complementos necesarios para una nueva instalación antes de pyWin32. Puede ser que las versiones posteriores vengan agrupadas, como con numpy, eso también tendría sentido. No puedo acceder a una instalación en bruto para ver si Glob está allí, después de haberlo puesto en la lista para instalarlo siempre está ahí; tal vez alguien con una instalación fresca / sin procesar de python pueda dar fe de eso.
Michael Stimson
1
@ MichaelMiles-Stimson - glob está en la biblioteca estándar de python - docs.python.org/2/library/glob.html y lo ha estado durante mucho, mucho tiempo
usuario2856
2

Puede usar una expresión generadora para encontrar eficientemente el tamaño del archivo de forma (es decir, incluir todos los archivos asociados). El siguiente método utiliza la funcionalidad incorporada de Python 2.7.

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))

La expresión del generador hace lo siguiente:

  1. Lista todos los archivos asociados de un shapefile. En este caso, quite la extensión ".shp" de la ruta y úsela globcon la ruta y el comodín *para enumerar todos los archivos asociados
  2. Obtenga los tamaños de archivo en bytes usando os.stat
  3. Súmelos usando el generador sum([...]).
Aaron
fuente