ArcPyでシェープファイルのサイズを取得していますか?


10

PythonとArcpyを使用してシェープファイルのサイズを取得することは可能ですか?もしそうなら、どうですか?


2
機能の量を意味しますか?対象地域は?物理ファイルのサイズは?
MaryBeth


はい、物理ファイルのサイズ。ごめんなさい。ありがとう@gene
John

@gene別のばかげた質問。os.path.getsize()は整数を返します。KBのデフォルトですか?
John

1
1kB = 1024バイト、バイトを1024で除算してキロバイトを取得します(または、単に混乱させるためにそのキビバイトでした)。同様に、MBには1024kB(MiB)、1 GBには1024 MB(GiB)があります。シェイプのサイズは、少なくともDBF、SHX、シェイプファイルのすべてのシェイプファイルではないことに注意してください。ディスク上の実際のサイズを取得するには、これらのファイルをすべて追加する必要があります
Michael Stimson、2015

回答:


14

有効なシェープファイル拡張子を持つシェープファイルディレクトリ内のすべてのファイルを反復処理し、それらのサイズを合計します。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です。グロブは本当に便利ですが、EmilsのソリューションはネイティブPythonであり、完全に正しいです。特定の状況では、ユーザーがサードパーティのソフトウェアをインストールできないため、globメソッドは副次的なものにすぎません。実行可能な(または現実的な)方法がない場合にのみ、サードパーティのインストールを必要とする回答をサポートします。ネイティブpythonで。
Michael Stimson、2015

@ MichaelMiles-Stimson globはネイティブですよね?
Emil Brundage、2015

私はそうは思いません、私はそれを手に入れて頻繁に使用していますが、私はそれをダウンロードしなければならなかったと確信しています。pyWin32の前に、新しいインストールに必要なプラグインのリストに入れました。numpyのように、それ以降のバージョンがバンドルされていることもあるかもしれませんが、これも意味があります。rawインストールにアクセスしてglobが存在するかどうかを確認することはできません。インストールするリストに配置すると、常に存在します。おそらく、Pythonのフレッシュ/ローインストールをしている誰かがそれを証明するでしょう。
Michael Stimson

1
@ MichaelMiles-Stimson-globは標準の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([...])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.