Recuperando o tamanho do shapefile no ArcPy?

10

É possível recuperar o tamanho de um shapefile usando python e arcpy? Se sim, como?

John
fonte
2
Você quer dizer a quantidade de recursos? A área coberta? O tamanho físico do arquivo?
precisa
sim, o tamanho do arquivo físico. Desculpa. Obrigado @gene
John
@gene Outra pergunta boba. os.path.getsize () retorna um número inteiro. é o padrão em KB?
John
1
1kB = 1024 bytes, divida os bytes por 1024 para obter kilobytes (ou eram esses kibibytes, apenas para confundir as coisas). Da mesma forma, há 1024kB em um MB (MiB), 1024 MB em 1 GB (GiB). Observe que o tamanho da forma não é todo o arquivo shapefile, há pelo menos DBF, SHX e é muito mais - você deve adicionar todos esses arquivos para obter o tamanho real no disco.
Michael Stimson

Respostas:

14

Itere todos os arquivos no diretório shapefile com uma extensão válida e adicione seus tamanhos. O osmódulo é útil para esta tarefa. Aqui está uma função que retorna o tamanho de todos os arquivos shapefile associados a um shapefile de entrada em bytes. Use o caminho completo do shapefile como sua entrada.

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
fonte
6
Em vez de listar todos os arquivos shpDir, você pode usar glob.glob(shpFlName + "*")apenas para retornar arquivos com o mesmo nome de base. Então é apenas um filtro em extensões válidas.
Paul
Isso é verdade @Paul, glob é realmente útil, no entanto, a solução de Emils é python nativa e absolutamente correta. O método glob deve ser apenas uma observação secundária, pois, em certas situações, os usuários não podem simplesmente instalar software de terceiros. Eu apenas daria suporte a uma resposta que requer instalação de terceiros se não houvesse uma maneira viável (ou realista) de fazer em python nativo.
Michael Stimson
@ MichaelMiles-Stimson globé nativo, sim?
Emil Brundage
Acho que não, eu o tenho e o uso com frequência, mas tenho quase a certeza de que precisava baixá-lo. Coloquei-o na minha lista de plugins necessários para uma nova instalação antes do pyWin32. Pode ser que versões posteriores sejam incluídas, como numpy, isso também faria sentido. Não consigo acessar uma instalação bruta para ver se a glob está lá; depois de colocá-la na lista a ser instalada, ela está sempre lá; talvez alguém com uma instalação nova / bruta de python possa atestar isso.
Michael Stimson
1
@ MichaelMiles-Stimson - glob está na biblioteca python padrão - docs.python.org/2/library/glob.html e está em muito tempo
user2856
2

Você pode usar uma expressão de gerador para encontrar com eficiência o tamanho do arquivo shapefile (ou seja, incluindo todos os arquivos associados). O método a seguir usa a funcionalidade interna do 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))

A expressão do gerador faz o seguinte:

  1. Listar todos os arquivos associados de um shapefile. Nesse caso, retire a extensão ".shp" do caminho e use globcom o caminho e o curinga *para listar todos os arquivos associados
  2. Obtenha os tamanhos de arquivo em bytes usando os.stat
  3. Soma-os usando o gerador sum([...]).
Aaron
fonte