Получить размер шейп-файла в ArcPy?

10

Можно ли получить размер шейп-файла, используя python и arcpy? Если так, то как?

Джон
источник
2
Вы имеете в виду количество функций? Площадь покрыта? Физический размер файла?
MaryBeth
да, физический размер файла. Сожалею. Спасибо @gene
Джон
@gene Еще один глупый вопрос. os.path.getsize () возвращает целое число. по умолчанию в КБ?
Джон
1
1kB = 1024 байта, разделите байты на 1024, чтобы получить килобайты (или это были кибибайты, просто чтобы запутать вещи). Точно так же есть 1024 КБ в МБ (МиБ), 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, glob действительно удобен, однако решение Эмильса - это родной питон и абсолютно правильное. Метод glob должен быть только дополнительным замечанием, так как в определенных ситуациях пользователи не могут просто установить стороннее программное обеспечение. Я бы поддержал ответ, который требует сторонней установки, только если не было жизнеспособного (или реалистичного) способа сделать это. это в родном питоне.
Майкл Стимсон
@ MichaelMiles-Стимсон globродной, да?
Эмиль Брюндейдж
Я не думаю, что это так, у меня это есть и я часто его использую, но я почти уверен, что мне пришлось его скачать .. Я поместил его в свой список необходимых плагинов для новой установки до pyWin32. Может случиться так, что более поздние версии будут поставляться в комплекте, как в numpy, это также имеет смысл. Я не могу получить доступ к необработанной установке, чтобы увидеть, есть ли глобус, поместив его в список для установки, он всегда там; возможно, кто-то с новой / сырой установкой python мог бы засвидетельствовать это.
Майкл Стимсон
1
@ MichaelMiles-Stimson - глоб находится в стандартной библиотеке Python - docs.python.org/2/library/glob.html и был очень-очень долгое время
user2856
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([...]).
Аарон
источник