Größe des Shapefiles in ArcPy abrufen?

10

Ist es möglich, die Größe eines Shapefiles mit Python und Arcpy abzurufen? Wenn das so ist, wie?

John
quelle
2
Meinen Sie die Anzahl der Funktionen? Das abgedeckte Gebiet? Die physische Dateigröße?
MaryBeth
Ja, die physische Dateigröße. Es tut uns leid. Vielen Dank, dass Sie @gene
John
@gene Noch eine dumme Frage. os.path.getsize () gibt eine Ganzzahl zurück. ist die Standardeinstellung in KB?
John
1
1 kB = 1024 Bytes, dividieren Sie Bytes durch 1024, um Kilobytes zu erhalten (oder waren das Kibibytes, nur um die Dinge zu verwirren). Ebenso sind 1024 KB in einem MB (MiB), 1024 MB in 1 GB (GiB). Beachten Sie, dass die Größe der Form nicht die gesamte Formdatei ist, sondern mindestens DBF, SHX und viel mehr. Sie sollten alle diese Dateien addieren, um die wahre Größe auf der Disc zu erhalten.
Michael Stimson

Antworten:

14

Durchlaufen Sie alle Dateien im Shapefile-Verzeichnis mit einer gültigen Shapefile-Erweiterung und addieren Sie deren Größen. Das osModul ist für diese Aufgabe hilfreich. Hier ist eine Funktion, die die Größe aller Shapefile-Dateien, die einem Eingabe-Shapefile zugeordnet sind, in Bytes zurückgibt. Verwenden Sie den vollständigen Pfad des Shapefiles als Eingabe.

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
quelle
6
Anstatt alle Dateien in aufzulisten shpDir, können Sie glob.glob(shpFlName + "*")nur Dateien zurückgeben, die denselben Basisnamen haben. Dann ist es nur ein Filter für gültige Erweiterungen.
Paul
Das stimmt @Paul, glob ist wirklich praktisch, aber Emils 'Lösung ist natives Python und absolut korrekt. Die Glob-Methode sollte nur eine Randnotiz sein, da Benutzer in bestimmten Situationen nicht einfach Software von Drittanbietern installieren können. Ich würde eine Antwort, die eine Installation von Drittanbietern erfordert, nur unterstützen, wenn es keine praktikable (oder realistische) Vorgehensweise gibt es in nativer Python.
Michael Stimson
@ MichaelMiles-Stimson globist gebürtig, ja?
Emil Brundage
Ich glaube nicht, dass ich es habe und es häufig benutze, aber ich bin mir ziemlich sicher, dass ich es herunterladen musste. Ich habe es vor pyWin32 auf meine Liste der erforderlichen Plugins für eine neue Installation gesetzt. Es kann sein, dass spätere Versionen wie bei Numpy gebündelt werden, was ebenfalls Sinn macht. Ich kann nicht auf eine unformatierte Installation zugreifen, um zu sehen, ob glob vorhanden ist. Vielleicht könnte jemand mit einer neuen / rohen Python-Installation dies bestätigen.
Michael Stimson
1
@ MichaelMiles-Stimson - Glob ist in der Standard-Python-Bibliothek - docs.python.org/2/library/glob.html und ist seit sehr langer Zeit
user2856
2

Sie können einen Generatorausdruck verwenden, um die Größe des Shapefiles effizient zu ermitteln (dh alle zugehörigen Dateien einzuschließen). Die folgende Methode verwendet die integrierte Python 2.7-Funktionalität.

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

Der Generatorausdruck führt Folgendes aus:

  1. Listen Sie alle zugehörigen Dateien eines Shapefiles auf. Entfernen Sie in diesem Fall die Erweiterung ".shp" vom Pfad und verwenden Sie globden Pfad und den Platzhalter, *um alle zugehörigen Dateien aufzulisten
  2. Holen Sie sich die Dateigrößen in Bytes mit os.stat
  3. Summiere sie mit dem Generator sum([...]).
Aaron
quelle