आर्कपी में शेपफाइल के आकार को पुनः प्राप्त करना?


10

क्या अजगर और चापलूसी का उपयोग करके एक आकृति का आकार प्राप्त करना संभव है? यदि हां, तो कैसे?


2
क्या आपको सुविधाओं की मात्रा से मतलब है? क्षेत्र को कवर किया? भौतिक फ़ाइल का आकार?
मैरीबैथ


हाँ, भौतिक फ़ाइल आकार। माफ़ करना। धन्यवाद @gene
जॉन

@ एक और मूर्खतापूर्ण सवाल। os.path.getsize () पूर्णांक देता है। KB में डिफ़ॉल्ट है?
जॉन

1
1kB = 1024 बाइट्स, किलोबाइट प्राप्त करने के लिए 1024 से बाइट्स को विभाजित करें (या यह किबिबाइट्स था, बस चीजों को भ्रमित करने के लिए)। इसी तरह एक MB (MiB) में 1024kB, 1 GB (GiB) में 1024 MB है। ध्यान दें कि आकार का आकार सभी के आकार का नहीं है DBF, SHX कम से कम और बहुत अधिक होने के लिए बाध्य है - आपको डिस्क पर सही आकार प्राप्त करने के लिए उन सभी फ़ाइलों को जोड़ना चाहिए ।
माइकल स्टिम्सन

जवाबों:


14

एक मान्य शेपफाइल एक्सटेंशन के साथ शेपफाइल निर्देशिका में सभी फाइलों के माध्यम से Iterate करें और उनके आकारों को एक साथ जोड़ें। 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, ग्लोब वास्तव में बहुत आसान है लेकिन एमिल्स का समाधान देशी अजगर है और बिल्कुल सही है। ग्लोब मेथड केवल एक साइड नोट होना चाहिए, जैसा कि कुछ स्थितियों में, उपयोगकर्ता केवल 3 पार्टी सॉफ्टवेयर स्थापित नहीं कर सकते हैं .. मैं केवल एक उत्तर का समर्थन करूंगा, जिसे करने के लिए कोई व्यवहार्य (या यथार्थवादी) तरीका नहीं था, तो एक 3 पार्टी इंस्टॉलेशन की आवश्यकता होती है। देशी अजगर में।
माइकल स्टिम्सन

@ MichaelMiles-Stimson globदेशी है, हाँ?
एमिल ब्रुंडेज

मुझे नहीं लगता कि यह है, मैंने इसे प्राप्त कर लिया है और इसे अक्सर उपयोग करता हूं लेकिन मुझे यकीन है कि मुझे इसे डाउनलोड करना होगा .. मैंने इसे pyWin32 से पहले एक नए इंस्टॉलेशन के लिए आवश्यक प्लगइन्स की अपनी सूची में डाल दिया था। यह हो सकता है कि बाद के संस्करण बंडल के साथ आए, जैसे कि खसखस, यह भी समझ में आएगा। मैं यह देखने के लिए एक कच्ची स्थापना तक नहीं पहुँच सकता कि ग्लोब वहाँ है, इसे सूची में रखने के लिए स्थापित किया जाए, यह हमेशा रहता है; शायद अजगर की एक ताजा / कच्ची स्थापना के साथ कोई भी उस पर ध्यान दे सकता है।
माइकल स्टिम्सन

1
@ MichaelMiles-Stimson - ग्लोब मानक पायथन लाइब्रेरी में है - docs.python.org/2/library/glob.html और बहुत लंबे समय से है
user2856

2

आप एक जनरेटर अभिव्यक्ति का उपयोग कुशलता से आकार आकार (यानी सभी संबंधित फ़ाइलों सहित) खोजने के लिए कर सकते हैं। निम्न विधि अंतर्निहित पायथन 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([...])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.