Pobierasz rozmiar pliku kształtu w ArcPy?

10

Czy można pobrać rozmiar pliku kształtu za pomocą Pythona i Arcpy? Jeśli tak to jak?

Jan
źródło
2
Masz na myśli liczbę funkcji? Obszar objęty? Fizyczny rozmiar pliku?
MaryBeth,
tak, fizyczny rozmiar pliku. Przepraszam. Dziękuję @gene
John
@ gen Kolejne głupie pytanie. os.path.getsize () zwraca liczbę całkowitą. jest domyślne w KB?
Jana,
1
1kB = 1024 bajty, podziel bajty przez 1024, aby uzyskać kilobajty (lub to były kibibajty, żeby pomylić rzeczy). Podobnie 1024 MB w MB (MiB), 1024 MB w 1 GB (GiB). Zwróć uwagę, że rozmiar kształtu to nie cały plik kształtów, w którym są DBF, SHX i na pewno będzie o wiele większy - powinieneś dodać wszystkie te pliki, aby uzyskać prawdziwy rozmiar na dysku.
Michael Stimson,

Odpowiedzi:

14

Iteruj przez wszystkie pliki w katalogu shapefile z prawidłowym rozszerzeniem shapefile i dodaj ich rozmiary razem. osModuł jest pomocne dla tego zadania. Oto funkcja, która zwraca rozmiar wszystkich plików shapefile powiązanych z wejściowym plikiem shapefile w bajtach. Użyj pełnej ścieżki pliku shapefile jako danych wejściowych.

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
źródło
6
Zamiast wylistować wszystkie pliki shpDir, możesz użyć glob.glob(shpFlName + "*")tylko do zwracania plików o tej samej nazwie basename. To tylko filtr do prawidłowych rozszerzeń.
Paul,
To prawda @Paul, glob jest naprawdę przydatny, jednak rozwiązanie Emilsa jest rodzimym pytonem i absolutnie poprawne. Metoda glob powinna być jedynie informacją poboczną, ponieważ w niektórych sytuacjach użytkownicy nie mogą po prostu zainstalować oprogramowania innej firmy. Poparłbym odpowiedź, która wymaga instalacji innej firmy, jeśli nie ma realnego (lub realistycznego) sposobu wykonania w natywnym pythonie.
Michael Stimson,
@ MichaelMiles-Stimson globjest ojczystym, tak?
Emil Brundage,
Nie sądzę, że tak, mam go i często go używam, ale jestem prawie pewien, że musiałem go pobrać. Umieściłem go na liście wymaganych wtyczek do nowej instalacji przed pyWin32. Może się zdarzyć, że późniejsze wersje będą dostarczane w pakiecie, tak jak w przypadku numpy, to również miałoby sens. Nie mogę uzyskać dostępu do surowej instalacji, aby sprawdzić, czy glob istnieje, ponieważ umieściłem go na liście do zainstalowania, zawsze tam jest; być może ktoś ze świeżą / surową instalacją Pythona mógłby to potwierdzić.
Michael Stimson,
1
@ MichaelMiles-Stimson - glob znajduje się w standardowej bibliotece Pythona - docs.python.org/2/library/glob.html i był przez bardzo długi czas
user2856
2

Możesz użyć wyrażenia generatora, aby efektywnie znaleźć rozmiar pliku kształtu (tj. Włączając wszystkie powiązane pliki). Poniższa metoda wykorzystuje wbudowaną funkcjonalność 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))

Wyrażenie generatora wykonuje następujące czynności:

  1. Wyświetl listę wszystkich powiązanych plików pliku shapefile. W takim przypadku usuń rozszerzenie „.shp” ze ścieżki i użyj globze ścieżką i symbolem wieloznacznym, *aby wyświetlić listę wszystkich powiązanych plików
  2. Uzyskaj rozmiary plików w bajtach za pomocą os.stat
  3. Zsumuj je za pomocą generatora sum([...]).
Aaron
źródło