Recupero della dimensione del file di forma in ArcPy?


10

È possibile recuperare le dimensioni di uno shapefile usando Python e Arcpy? Se é cosi, come?


2
Intendi la quantità di funzionalità? L'area coperta? La dimensione del file fisico?
MaryBeth,


sì, la dimensione del file fisico. Scusate. Grazie @gene
John,

@gene Un'altra domanda sciocca. os.path.getsize () restituisce un numero intero. è l'impostazione predefinita in KB?
Giovanni,

1
1kB = 1024 byte, dividere i byte per 1024 per ottenere kilobyte (o era quel kibibyte, solo per confondere le cose). Allo stesso modo ci sono 1024 KB in un MB (MiB), 1024 MB in 1 GB (GiB). Nota che la dimensione della forma non è tutta dello shapefile che c'è almeno DBF, SHX e destinata ad essere molto più - dovresti sommare tutti quei file per ottenere la dimensione reale sul disco.
Michael Stimson,

Risposte:


14

Scorrere tutti i file nella directory dello shapefile con un'estensione dello shapefile valida e sommare le loro dimensioni. Il osmodulo è 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

6
Invece di elencare tutti i file shpDir, è possibile utilizzare glob.glob(shpFlName + "*")solo per restituire file con lo stesso nome di base. Quindi è solo un filtro su estensioni valide.
Paul,

È vero @Paul, glob è davvero utile, tuttavia la soluzione di Emils è pitone nativo e assolutamente corretta. Il metodo glob dovrebbe essere solo una nota a margine poiché, in determinate situazioni, gli utenti non possono semplicemente installare software di terze parti. Supporterei solo una risposta che richiede un'installazione di terze parti se non esistesse un modo fattibile (o realistico) di fare in pitone nativo.
Michael Stimson,

@ MichaelMiles-Stimson globè nativo, sì?
Emil Brundage,

Non penso che lo sia, l'ho preso e lo uso spesso ma sono quasi sicuro di averlo scaricato .. L'ho messo sul mio elenco di plugin richiesti per una nuova installazione prima di pyWin32. Può darsi che le versioni successive vengano raggruppate, come con Numpy, anche questo avrebbe senso. Non riesco ad accedere a un'installazione non elaborata per vedere se glob è presente, dopo averlo inserito nell'elenco da installare è sempre presente; forse qualcuno con un'installazione fresca / grezza di python potrebbe attestarlo.
Michael Stimson,

1
@ MichaelMiles-Stimson - glob è nella libreria standard di Python - docs.python.org/2/library/glob.html ed è stato per molto tempo
user2856

2

È 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:

  1. Elenca tutti i file associati di uno shapefile. In questo caso, rimuovere l'estensione ".shp" dal percorso e utilizzare globcon il percorso e il carattere jolly *per elencare tutti i file associati
  2. Ottieni le dimensioni del file in byte usando os.stat
  3. Sommarli usando il generatore sum([...]).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.