Mengambil ukuran shapefile di ArcPy?

10

Apakah mungkin untuk mengambil ukuran shapefile menggunakan python dan arcpy? Jika ya, bagaimana caranya?

John
sumber
2
Apakah maksud Anda jumlah fitur? Area yang dicakup? Ukuran file fisik?
MaryBeth
ya, ukuran file fisiknya. Maaf. Terima kasih @ gen
John
@ Gen pertanyaan konyol lainnya. os.path.getsize () mengembalikan integer. apakah standar dalam KB?
John
1
1kB = 1024 byte, bagi byte dengan 1024 untuk mendapatkan kilobyte (atau apakah itu kibibyte, hanya untuk membingungkan hal-hal). Demikian juga ada 1024kB dalam MB (MiB), 1024 MB dalam 1 GB (GiB). Perhatikan bahwa ukuran bentuk tidak semua dari shapefile ada DBF, paling tidak SHX dan pasti lebih banyak - Anda harus menambahkan semua file untuk mendapatkan ukuran sebenarnya pada disk.
Michael Stimson

Jawaban:

14

Iterasi semua file dalam direktori shapefile dengan ekstensi shapefile yang valid dan tambahkan ukurannya bersama-sama. The osModul ini berguna untuk tugas ini. Berikut adalah fungsi yang mengembalikan ukuran semua file shapefile yang terkait dengan input shapefile dalam byte. Gunakan path lengkap dari shapefile sebagai input Anda.

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
sumber
6
Alih-alih mendaftar semua file shpDir, Anda dapat menggunakan glob.glob(shpFlName + "*")hanya mengembalikan file yang memiliki nama samaran yang sama. Maka itu hanya filter pada ekstensi yang valid.
Paul
Itu benar @ Paul, glob sangat berguna namun solusi Emils adalah python asli dan benar-benar benar. Metode glob seharusnya hanya menjadi catatan tambahan karena, dalam situasi tertentu, pengguna tidak dapat hanya menginstal perangkat lunak pihak ke-3. Saya hanya akan mendukung jawaban yang memerlukan instalasi pihak ke-3 jika tidak ada cara yang layak (atau realistis) untuk melakukan itu dalam python asli.
Michael Stimson
@ MichaelMiles-Stimson globasli, ya?
Emil Brundage
Saya rasa tidak, saya sudah mendapatkannya dan sering menggunakannya, tetapi saya yakin saya harus mengunduhnya .. Saya meletakkannya di daftar plugin yang diperlukan untuk instalasi baru sebelum pyWin32. Bisa jadi versi yang lebih baru dibundel, seperti numpy, itu juga masuk akal. Saya tidak dapat mengakses instalasi mentah untuk melihat apakah glob ada di sana, setelah memasukkannya ke daftar yang akan diinstal selalu ada; mungkin seseorang dengan instalasi python yang segar / mentah bisa membuktikannya.
Michael Stimson
1
@ MichaelMiles-Stimson - glob ada di pustaka python standar - docs.python.org/2/library/glob.html dan telah sangat lama
user2856
2

Anda dapat menggunakan ekspresi generator untuk secara efisien menemukan ukuran shapefile (yaitu termasuk semua file terkait). Metode berikut ini menggunakan fungsionalitas Python 2.7 bawaan.

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

Ekspresi generator melakukan hal berikut:

  1. Daftar semua file yang terkait dari suatu shapefile. Dalam hal ini, lepaskan ekstensi ".shp" dari path dan gunakan globdengan path dan wildcard *untuk mendaftar semua file terkait
  2. Dapatkan ukuran file dalam byte menggunakan os.stat
  3. Jumlahkan mereka menggunakan generator sum([...]).
Harun
sumber