Récupération de la taille du fichier de formes dans ArcPy?

10

Est-il possible de récupérer la taille d'un fichier de formes en utilisant python et arcpy? Si c'est le cas, comment?

John
la source
2
Voulez-vous dire la quantité de fonctionnalités? La zone couverte? La taille du fichier physique?
MaryBeth
oui, la taille du fichier physique. Pardon. Merci @gene
John
@gene Une autre question stupide. os.path.getsize () renvoie un entier. est la valeur par défaut en Ko?
John
1
1 Ko = 1 024 octets, divisez les octets par 1 024 pour obtenir des kilo-octets (ou était-ce des kibio-octets, juste pour confondre les choses). De même, il y a 1024 Ko dans un Mo (MiB), 1024 Mo dans 1 Go (GiB). Notez que la taille de la forme n'est pas tout le fichier de formes qu'il y a au moins DBF, SHX et devrait être beaucoup plus - vous devez ajouter tous ces fichiers pour obtenir la vraie taille sur le disque.
Michael Stimson

Réponses:

14

Parcourez tous les fichiers du répertoire de fichiers de formes avec une extension de fichier de formes valide et ajoutez leurs tailles ensemble. Le osmodule est utile pour cette tâche. Voici une fonction qui renvoie la taille de tous les fichiers de fichiers de formes associés à un fichier de formes d'entrée en octets. Utilisez le chemin complet du fichier de formes comme entrée.

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
la source
6
Au lieu de répertorier tous les fichiers shpDir, vous pouvez utiliser glob.glob(shpFlName + "*")pour renvoyer uniquement les fichiers ayant le même nom de base. Ensuite, c'est juste un filtre sur les extensions valides.
Paul
C'est vrai @Paul, glob est vraiment pratique, mais la solution d'Emils est en python natif et absolument correcte. La méthode glob ne devrait être qu'une note secondaire car, dans certaines situations, les utilisateurs ne peuvent pas simplement installer un logiciel tiers. en python natif.
Michael Stimson
@ MichaelMiles-Stimson globest natif, oui?
Emil Brundage
Je ne pense pas que ce soit le cas, je l'ai et je l'utilise fréquemment mais je suis à moitié sûr de devoir le télécharger .. Je l'ai mis sur ma liste de plugins requis pour une nouvelle installation avant pyWin32. Il se peut que des versions ultérieures soient fournies, comme avec numpy, cela aurait également du sens. Je ne peux pas accéder à une installation brute pour voir si glob est là, l'ayant mis sur la liste à installer, il est toujours là; peut-être que quelqu'un avec une installation fraîche / brute de python pourrait en témoigner.
Michael Stimson
1
@ MichaelMiles-Stimson - glob est dans la bibliothèque python standard - docs.python.org/2/library/glob.html et est depuis très très longtemps
user2856
2

Vous pouvez utiliser une expression de générateur pour trouver efficacement la taille du fichier de formes (c'est-à-dire y compris tous les fichiers associés). La méthode suivante utilise la fonctionnalité Python 2.7 intégrée.

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'expression du générateur fait ce qui suit:

  1. Répertorie tous les fichiers associés d'un fichier de formes. Dans ce cas, supprimez l'extension ".shp" du chemin d'accès et utilisez-la globavec le chemin d'accès et le caractère générique *pour répertorier tous les fichiers associés
  2. Obtenez les tailles de fichier en octets en utilisant os.stat
  3. Additionnez-les à l'aide du générateur sum([...]).
Aaron
la source