ArcPy에서 shapefile의 크기를 검색 하시겠습니까?


10

파이썬과 arcpy를 사용하여 shapefile의 크기를 검색 할 수 있습니까? 그렇다면 어떻게?


2
기능의 양을 의미합니까? 해당 지역은? 실제 파일 크기는?
MaryBeth


예, 실제 파일 크기 죄송합니다. @gene 감사합니다
John

@gene 또 다른 바보 같은 질문. os.path.getsize ()는 정수를 리턴합니다. KB의 기본값은 무엇입니까?
John

1
1kB = 1024 바이트, 킬로바이트를 얻기 위해 바이트를 1024로 나누십시오. 마찬가지로 MB (MiB)에는 1024kB, 1GB (GiB)에는 1024MB가 있습니다. 셰이프의 크기가 DBF, SHX 가있는 셰이프 파일 모두 가 아니고 훨씬 더 제한적이라는 점에 유의하십시오 . 디스크 에서 실제 크기 를 얻으려면 모든 파일을 추가해야합니다 .
Michael Stimson

답변:


14

shapefile 디렉토리의 모든 파일을 유효한 shapefile 확장자로 반복 하고 크기를 함께 추가하십시오. os모듈은이 작업에 도움이됩니다. 다음은 입력 shapefile과 관련된 모든 shapefile 파일의 크기를 바이트 단위로 반환하는 함수입니다. shapefile의 전체 경로를 입력으로 사용하십시오.

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

사실 @Paul, glob는 정말 편리하지만 Emils의 솔루션은 기본 파이썬이며 절대적으로 정확합니다. glob 방법은 특정 상황에서 사용자가 타사 소프트웨어를 설치할 수 없기 때문에 부수적 인 방법으로 만 사용해야합니다. 실행 가능한 (또는 현실적인) 방법이없는 경우 타사 설치가 필요한 응답 만 지원합니다. 네이티브 파이썬으로.
Michael Stimson

@ MichaelMiles-Stimson glob은 네이티브입니까?
Emil Brundage

나는 그것을 생각하지 않고 그것을 가지고 자주 사용하지만 그것을 다운로드해야한다고 확신합니다. pyWin32 이전에 새로운 설치를 위해 필요한 플러그인 목록에 추가했습니다. numpy와 마찬가지로 이후 버전도 번들로 제공 될 수 있습니다. 글로브 설치가 있는지 확인하기 위해 원시 설치에 액세스 할 수 없으며 항상 설치되도록 목록에 배치했습니다. 아마도 새로 설치하거나 파이썬을 설치 한 사람이 그것을 증명할 수 있습니다.
Michael Stimson

1
@ MichaelMiles-Stimson-glob는 표준 파이썬 라이브러리 -docs.python.org/2/library/glob.html에 있으며 매우 오랜 시간 동안 사용되었습니다
user2856

2

생성기 표현식을 사용하여 shapefile 크기 (예 : 모든 관련 파일 포함)를 효율적으로 찾을 수 있습니다. 다음 방법은 내장 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. shapefile의 모든 관련 파일을 나열하십시오. 이 경우 경로에서 ".shp"확장자를 제거 glob하고 경로 및 와일드 카드와 함께 사용 하여 *모든 관련 파일을 나열하십시오.
  2. 다음을 사용하여 파일 크기를 바이트 단위로 가져옵니다. os.stat
  3. 발전기를 사용하여 합산하십시오 sum([...]).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.