ArcPy'de şekil dosyasının boyutu alınıyor mu?


10

Python ve arcpy kullanarak bir şekil dosyasının boyutunu almak mümkün müdür? Öyleyse nasıl?


2
Özelliklerin miktarını mı kastediyorsunuz? Kapsanan alan? Fiziksel dosya boyutu?
MaryBeth


evet, fiziksel dosya boyutu. Afedersiniz. Thank you @gene
John

@gene Aptalca bir soru daha. os.path.getsize () bir tamsayı döndürür. KB'lerde varsayılan nedir?
John

1
1kB = 1024 bayt, kilobayt elde etmek için baytları 1024'e bölün (ya da sadece şeyleri karıştırmak için bu kibibitlerdi). Aynı şekilde bir MB (MiB) içinde 1024kB, 1 GB'da (GiB) 1024 MB vardır. Şeklin boyutu olmadığını Not tüm shape orada en azından DBF, SHX var ve çok daha fazlası olması kaçınılmaz - Eğer elde etmek tüm bu dosyaları eklemek gerekir gerçek diskte boyutunu.
Michael Stimson

Yanıtlar:


14

Geçerli bir şekil dosyası uzantısıyla şekil dosyası dizinindeki tüm dosyalar arasında yineleme yapın ve boyutlarını birlikte ekleyin. osModül, bu görev için yararlıdır. Burada, bir girdi şekil dosyasıyla ilişkili tüm şekil dosyası dosyalarının boyutunu bayt cinsinden döndüren bir işlev vardır. Girişiniz olarak şekil dosyasının tam yolunu kullanın.

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
İçindeki tüm dosyaları listelemek yerine, yalnızca aynı taban adına sahip dosyaları döndürmek için shpDirkullanabilirsiniz glob.glob(shpFlName + "*"). O zaman sadece geçerli uzantılarda bir filtre.
Paul

@Paul, glob gerçekten kullanışlı ancak Emils'in çözümü yerel python ve kesinlikle doğru. Glob yöntemi, yalnızca bazı durumlarda, kullanıcıların yalnızca 3. taraf yazılım yükleyemediği için bir yan not olmalıdır. yerel python içinde.
Michael Stimson

@ MichaelMiles-Stimson globyerli, evet?
Emil Brundage

Ben olduğunu sanmıyorum, sık sık alıyorum ve onu kullanmak ama ben indirmek zorunda yarı eminim .. pyWin32 önce yeni bir kurulum için gerekli eklentiler listeme koydu. Daha sonraki sürümler numpy'de olduğu gibi birlikte gelir, bu da mantıklı olabilir. Glob'un orada olup olmadığını görmek için ham bir yüklemeye erişemiyorum, yüklenecek listeye koyduktan sonra her zaman orada; belki de taze / ham python yüklemesi olan biri bunu kanıtlayabilir.
Michael Stimson

1
@ MichaelMiles-Stimson - glob standart python kütüphanesinde - docs.python.org/2/library/glob.html ve çok uzun zamandır var
user2856

2

Şekil dosyası boyutunu etkili bir şekilde bulmak için bir jeneratör ifadesi kullanabilirsiniz (örn. İlişkili tüm dosyalar dahil). Aşağıdaki yöntemde yerleşik Python 2.7 işlevselliği kullanılmaktadır.

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

Jeneratör ifadesi aşağıdakileri yapar:

  1. Bir şekil dosyasının ilişkili tüm dosyalarını listeler. Bu durumda, ".shp" uzantısını yoldan ayırın ve ilişkili tüm dosyaları listelemek globiçin yol ve joker karakterle birlikte kullanın*
  2. Dosya boyutlarını kullanarak bayt cinsinden alın os.stat
  3. Jeneratörü kullanarak toplayın sum([...]).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.