在ArcPy中检索shapefile的大小?


10

是否可以使用python和arcpy检索shapefile的大小?如果是这样,怎么办?


2
您是指功能数量吗?覆盖面积?物理文件大小?
MaryBeth


是的,物理文件的大小。抱歉。谢谢@gene
John

@gene另一个愚蠢的问题。os.path.getsize()返回一个整数。是KB的默认值?
约翰

1
1kB = 1024字节,将字节除以1024得到千字节(或者就是千字节,只是为了弄乱事情)。同样,MB(MiB)中有1024kB,1 GB(GiB)中有1024 MB。请注意,形状的大小不是至少有DBF,SHX的所有 shapefile,而且肯定还有更多-您应该将所有这些文件加起来以获得光盘上的真实大小。
Michael Stimson 2015年

Answers:


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的解决方案是本机python,绝对正确。glob方法仅应作为附带说明,因为在某些情况下,用户不能仅安装第三方软件。如果没有可行的(或现实的)方法,我只支持需要第三方安装的答案。它在本地python中。
Michael Stimson 2015年

@ MichaelMiles-Stimson glob是本地人,是吗?
Emil Brundage 2015年

我不认为这是我已经拥有并经常使用它,但是我不确定我必须下载它。.在pyWin32之前,我将其放在新安装所需的插件列表中。也许将更高版本与numpy捆绑在一起也很有意义。我无法访问原始安装来查看glob是否存在,已经将其放置在要安装的列表中,并且它始终存在。也许使用全新/原始安装的python可以证明这一点。
Michael Stimson 2015年

1
@ MichaelMiles-Stimson-glob在标准的python库中-docs.python.org/2/library/glob.html,已经存在很长时间了
user2856 2015年

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([...])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.