กำลังเรียกขนาด Shapefile ใน ArcPy หรือไม่


10

เป็นไปได้หรือไม่ที่จะดึงขนาดของ shapefile โดยใช้ python และ arcpy? ถ้าเป็นเช่นนั้นได้อย่างไร


2
คุณหมายถึงจำนวนของคุณสมบัติหรือไม่ พื้นที่ครอบคลุมหรือไม่ ขนาดฟิสิคัลไฟล์?
MaryBeth


ใช่ขนาดฟิสิคัลไฟล์ ขอโทษ ขอบคุณ @gene
John

@ gene คำถามโง่อีกข้อ os.path.getsize () ส่งคืนเลขจำนวนเต็ม เป็นค่าเริ่มต้นใน KB หรือไม่
จอห์น

1
1kB = 1024 ไบต์แบ่งไบต์ด้วย 1024 เพื่อรับกิโลไบต์ (หรือเป็น kibibytes นั้นเพื่อทำให้สับสน) ในทำนองเดียวกันมี 1024kB ใน MB (MiB), 1024 MB ใน 1 GB (GiB) โปรดทราบว่าขนาดของรูปร่างไม่ใช่ขนาดไฟล์ทั้งหมดที่มี DBF, SHX เป็นอย่างน้อยและถูกผูกไว้ให้มีมากขึ้น - คุณควรเพิ่มไฟล์ทั้งหมดเหล่านั้นเพื่อให้ได้ขนาดที่แท้จริงบนแผ่นดิสก์
Michael Stimson

คำตอบ:


14

ทำซ้ำผ่านไฟล์ทั้งหมดในไดเร็กทอรี shapefile ด้วยส่วนขยาย shapefile ที่ถูกต้องและเพิ่มขนาดเข้าด้วยกัน osโมดูลจะมีประโยชน์สำหรับงานนี้ นี่คือฟังก์ชั่นที่คืนค่าขนาดของไฟล์ shapefile ทั้งหมดที่เชื่อมโยงกับ input เชพไฟล์เป็นไบต์ ใช้เส้นทางแบบเต็มของ 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, glob มีประโยชน์จริงๆ แต่โซลูชั่นของ Emils คือภาษาไพ ธ อนและถูกต้องอย่างแท้จริง วิธี glob ควรเป็นหมายเหตุข้างในในบางสถานการณ์ผู้ใช้ไม่สามารถติดตั้งซอฟต์แวร์ของบุคคลที่สามได้ฉันจะสนับสนุนเฉพาะคำตอบที่ต้องมีการติดตั้งของบุคคลที่สามหากไม่มีวิธีที่ปฏิบัติได้จริง (หรือเป็นจริง) มันอยู่ในหลามพื้นเมือง
Michael Stimson

@ MichaelMiles-Stimson globมีถิ่นกำเนิดใช่ไหม?
Emil Brundage

ฉันไม่คิดว่ามันเป็นฉันได้รับมันและใช้งานบ่อย แต่ฉันกึ่งแน่ใจว่าฉันต้องดาวน์โหลดมัน .. ฉันวางไว้ในรายการของปลั๊กอินที่จำเป็นสำหรับการติดตั้งใหม่ก่อน pyWin32 อาจเป็นไปได้ว่ารุ่นต่อมามารวมกันเช่นเดียวกับ numpy ที่จะทำให้รู้สึก ฉันไม่สามารถเข้าถึงการติดตั้งแบบดิบเพื่อดูว่ามี glob อยู่หรือไม่โดยใส่ไว้ในรายการเพื่อติดตั้งที่นั่นเสมอ บางทีบางคนที่มีการติดตั้งไพ ธ อนแบบสดๆ / ดิบสามารถยืนยันได้
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. แสดงรายการไฟล์ที่เกี่ยวข้องทั้งหมดของ shapefile ในกรณีนี้ให้ตัดส่วนขยาย ".shp" ออกจากพา ธ และใช้globกับพา ธ และไวด์การ์ด*เพื่อแสดงรายการไฟล์ที่เกี่ยวข้องทั้งหมด
  2. รับขนาดไฟล์เป็นไบต์โดยใช้ os.stat
  3. sum([...])รวมพวกเขาโดยใช้เครื่องกำเนิดไฟฟ้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.