Отримання розміру формфайлу в ArcPy?


10

Чи можливо отримати розмір файлу форми за допомогою python та arcpy? Якщо так, то як?


2
Ви маєте на увазі кількість функцій? Покрита територія? Фізичний розмір файлу?
MaryBeth


так, фізичний розмір файлу. Вибачте. Дякую @gene
Джон

@gene Ще одне дурне питання. os.path.getsize () повертає ціле число. за замовчуванням у КБ?
Іван

1
1kB = 1024 байт, розділіть байт на 1024, щоб отримати кілобайт (або це було кібібайт, просто щоб заплутати речі). Так само є 1024 кБ в МБ (MiB), 1024 МБ в 1 ГБ (ГіБ). Зауважте, що розмір форми не є всім файлом форм, який є , як мінімум, DBF, SHX і повинен бути набагато більшим - вам слід додати всі ці файли, щоб отримати справжній розмір на диску.
Майкл Стімсон

Відповіді:


14

Ітерація всіх файлів у каталозі shapefile з дійсним розширенням shapefile та додайте їх розміри разом. osМодуль є корисним для вирішення цього завдання. Ось функція, яка повертає розмір усіх файлів форм-файлів, пов'язаних із вхідним файлом форм у байтах. Використовуйте повний шлях формфайлу як свій вхід.

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
Замість того, щоб перелічувати всі файли в shpDir, ви можете використовувати glob.glob(shpFlName + "*")лише для повернення файлів, що мають однакове базове ім'я. Тоді це лише фільтр на дійсні розширення.
Пол

Це правда @Paul, глобус дуже зручний, але рішення Еміля - це нативний пітон і абсолютно коректний. Глобусний метод повинен бути лише бічною запискою, оскільки, у певних ситуаціях, користувачі не можуть просто встановити програмне забезпечення сторонніх розробників. Я б підтримав лише відповідь, яка вимагає встановлення сторонніх розробників, якщо не було життєздатного (або реалістичного) способу здійснення це в рідному пітоні.
Майкл Стімсон

@ MichaelMiles-Стимсон globрідний, так?
Брюндаж Еміля

Я не думаю, що це так, я його отримую і використовую часто, але я напів впевнений, що мені довелося його завантажувати .. Я ставлю його до мого списку необхідних плагінів для нової установки перед pyWin32. Можливо, пізніші версії поставляються в комплекті, як і numpy, що також має сенс. Я не можу отримати доступ до необмеженої інсталяції, щоб побачити, чи існує глобальна версія, поставивши її до списку для встановлення, він завжди є; можливо, хтось із свіжою / сирою установкою пітона міг би це засвідчити.
Майкл Стімсон

1
@ MichaelMiles-Stimson - глобус знаходиться в стандартній бібліотеці python - docs.python.org/2/library/glob.html і вже дуже давно
користувач2856

2

Ви можете використовувати генераторний вираз для ефективного пошуку розміру файлу форми (тобто включення всіх пов'язаних файлів). У наступному методі використовується вбудована функція 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))

Вираз генератора робить наступне:

  1. Перерахуйте всі пов'язані з ними файли форми. У цьому випадку зніміть розширення ".shp" з шляху та використовуйте globразом із контуром та підстановкою *список усіх пов’язаних файлів
  2. Отримайте розміри файлів у байтах за допомогою os.stat
  3. Підсумуйте їх за допомогою генератора sum([...]).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.