Lấy kích thước của shapefile trong ArcPy?


10

Có thể lấy kích thước của một shapefile bằng python và arcpy không? Nếu vậy thì thế nào?


2
Bạn có nghĩa là số lượng các tính năng? Diện tích bao phủ? Kích thước tập tin vật lý?
MaryBeth


có, kích thước tập tin vật lý. Lấy làm tiếc. Cảm ơn bạn @gene
John

@gene Một câu hỏi ngớ ngẩn khác. os.path.getsize () trả về một số nguyên. là mặc định trong KB?
Giăng

1
1kB = 1024 byte, chia byte cho 1024 để thu được kilobyte (hoặc đó là kibibytes, chỉ để gây nhầm lẫn mọi thứ). Tương tự, có 1024kB trong một MB (MiB), 1024 MB trong 1 GB (GiB). Lưu ý rằng kích thước của hình dạng không phải là tất cả các shapefile có DBF, SHX ít nhất và bị ràng buộc nhiều hơn nữa - bạn nên thêm tất cả các tệp đó để có được kích thước thật trên đĩa.
Michael Promotionson

Câu trả lời:


14

Lặp lại tất cả các tệp trong thư mục shapefile với phần mở rộng shapefile hợp lệ và thêm kích thước của chúng lại với nhau. Các osmô-đun là hữu ích cho nhiệm vụ này. Đây là một hàm trả về kích thước của tất cả các tệp shapefile được liên kết với một shapefile đầu vào theo byte. Sử dụng đường dẫn đầy đủ của shapefile làm đầu vào của bạ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
Thay vì liệt kê tất cả các tệp trong shpDir, bạn có thể sử dụng glob.glob(shpFlName + "*")để chỉ trả về các tệp có cùng tên cơ sở. Sau đó, nó chỉ là một bộ lọc trên các phần mở rộng hợp lệ.
Paul

Đó là sự thật @Paul, global thực sự tiện dụng tuy nhiên giải pháp của Emils là trăn bản địa và hoàn toàn chính xác. Phương thức toàn cầu chỉ nên là một lưu ý phụ vì trong một số trường hợp, người dùng không thể chỉ cài đặt phần mềm của bên thứ ba .. Tôi chỉ hỗ trợ câu trả lời yêu cầu cài đặt của bên thứ 3 nếu không có cách nào khả thi (hoặc thực tế) nó ở trăn bản địa.
Michael Promotionson

@ MichaelMiles-Kích thích globlà bản địa, phải không?
Emil Brundage

Tôi không nghĩ là vậy, tôi đã có nó và sử dụng nó thường xuyên nhưng tôi chắc chắn rằng tôi phải tải xuống .. Tôi đã đưa nó vào danh sách các plugin cần thiết cho một cài đặt mới trước pyWin32. Nó có thể là các phiên bản sau đi kèm, như với numpy, cũng sẽ có ý nghĩa. Tôi không thể truy cập cài đặt thô để xem có toàn cầu ở đó không, khi đưa nó vào danh sách cần cài đặt thì nó luôn ở đó; có lẽ ai đó với một cài đặt trăn tươi / thô có thể chứng thực điều đó.
Michael Promotionson

1
@ MichaelMiles-Stimson - glob là trong thư viện python tiêu chuẩn - docs.python.org/2/library/glob.html và đã được cho một thời gian rất rất dài
user2856

2

Bạn có thể sử dụng biểu thức trình tạo để tìm hiệu quả kích thước shapefile (nghĩa là bao gồm tất cả các tệp được liên kết). Phương pháp sau đây sử dụng chức năng Python 2.7 tích hợp.

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

Biểu thức trình tạo thực hiện như sau:

  1. Liệt kê tất cả các tập tin liên quan của một shapefile. Trong trường hợp này, loại bỏ phần mở rộng ".shp" khỏi đường dẫn và sử dụng globvới đường dẫn và ký tự đại diện *để liệt kê tất cả các tệp được liên kết
  2. Lấy kích thước tệp theo byte bằng cách sử dụng os.stat
  3. Tính tổng chúng bằng cách sử dụng máy phát điện sum([...]).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.