मैं पायथन में फ़ाइल का आकार कैसे जांच सकता हूं?


756

मैं विंडोज में एक पायथन स्क्रिप्ट लिख रहा हूं। मैं फ़ाइल आकार के आधार पर कुछ करना चाहता हूं। उदाहरण के लिए, यदि आकार 0 से अधिक है, तो मैं किसी को ईमेल भेजूंगा, अन्यथा अन्य चीजों के लिए जारी रखें।

मैं फ़ाइल का आकार कैसे जाँचूँ?


2
Path('./doc.txt').stat().st_size
बोरिस

धन्यवाद @ आधुनिक पायथन के लिए बोरिस (v3.4 +) उत्तर :)
mab

जवाबों:


734

आपको द्वारा दी गई वस्तु की st_sizeसंपत्ति चाहिए । आप इसे (पायथन 3.4+) का उपयोग करके प्राप्त कर सकते हैं :os.statpathlib

>>> from pathlib import Path
>>> Path('somefile.txt').stat()
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> Path('somefile.txt').stat().st_size
1564

या उपयोग कर रहा है os.stat:

>>> import os
>>> os.stat('somefile.txt')
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> os.stat('somefile.txt').st_size
1564

आउटपुट बाइट्स में है।


2
यदि कुछ भी हो, तो मान को फ़ाइल सिस्टम ब्लॉक आकार के गुणकों (उदाहरण के लिए 4096 बाइट्स) के रूप में पारित किया जा सकता है। खुशी से, यह बाइट्स के बजाय दिया जाता है।
जोश

1
@ जोश - हाँ, यह अच्छा है, "डिस्क पर आकार" के लिए आप stat_result.st_blocksब्लॉक आकार से गुणा कर सकते हैं , लेकिन मैं अभी भी खोज रहा हूं कि इसे प्रोग्रामेटिक रूप से और क्रॉस-प्लेटफॉर्म कैसे प्राप्त किया जाए ( tune2fsआदि के माध्यम से नहीं )
टॉमस गैंडर

1097

का उपयोग कर os.path.getsize:

>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611

आउटपुट बाइट्स में है।


124
ध्यान दें: का कार्यान्वयन os.path.getsizeबस हैreturn os.stat(filename).st_size
wim

तो क्या os.path.getize का उपयोग os.stat (फ़ाइल) .st_size के विपरीत करने से एक मिनट का प्रदर्शन नुकसान है?
शब्दफिरवाइज

5
@wordsforthewise इसे मापें! ~ मेरे कंप्यूटर में 150 एन.एस.
डेविड मम

@wordsforthewise यह एक समस्या का अधिक है यदि आप फ़ाइल के बारे में अन्य बातें (संशोधन समय, फ़ाइल का प्रकार, जैसे) प्राप्त करना चाहते हैं - तो आप यह सब एक सिस्टम कॉल के माध्यम से प्राप्त कर सकते हैं os.stat। तब अंतर काफी हद तक माइक्रोसेकंड में चल सकता था :-)
greggo

अगर किसी फाइल के बनने के बाद इसे सही कहा जाता है, तो यह 0 @danben
alper

131

अन्य उत्तर वास्तविक फ़ाइलों के लिए काम करते हैं, लेकिन अगर आपको "फ़ाइल जैसी वस्तुओं" के लिए काम करने की आवश्यकता है, तो यह कोशिश करें:

# f is a file-like object. 
f.seek(0, os.SEEK_END)
size = f.tell()

यह मेरे सीमित परीक्षण में वास्तविक फ़ाइलों और स्ट्रिंगो के लिए काम करता है। (पायथन 2.7.3।) "फाइल-लाइक ऑब्जेक्ट" एपीआई वास्तव में एक कठोर इंटरफ़ेस नहीं है, लेकिन एपीआई प्रलेखन का सुझाव है कि फ़ाइल जैसी वस्तुओं का समर्थन करना चाहिए seek()और tell()

संपादित करें

इसके बीच एक और अंतर यह os.stat()है कि आप stat()एक फाइल कर सकते हैं, भले ही आपको इसे पढ़ने की अनुमति न हो। जब तक आपने अनुमति नहीं ली है, स्पष्ट रूप से तलाश / बताओ दृष्टिकोण काम नहीं करेगा।

संपादित करें 2

जोनाथन के सुझाव पर, यहां एक विरोधाभास संस्करण है। (संस्करण ऊपर फ़ाइल पॉइंटर को फ़ाइल के अंत में छोड़ देता है, इसलिए यदि आप फ़ाइल से पढ़ने का प्रयास करते हैं, तो आपको शून्य बाइट्स वापस मिल जाएगी!)

# f is a file-like object. 
old_file_position = f.tell()
f.seek(0, os.SEEK_END)
size = f.tell()
f.seek(old_file_position, os.SEEK_SET)

8
आपको आयात करने की आवश्यकता नहीं है os, इसके बजाय f.seek(0, 2)अंत से 0 बाइट्स की तलाश करें।
cdosborn

2
और अंतिम पंक्ति के लिए, यदि osइसका उपयोग नहीं किया जाता है:f.seek(old_file_position, 0)
luckydonald

48
यदि आप नामित चर के बजाय पूर्णांक शाब्दिक का उपयोग करते हैं, तो आप अपने कोड को बनाए रखने के लिए किसी को भी यातना दे रहे हैं। आयात न करने का कोई सम्मोहक कारण नहीं है os
मार्क ई। हासे

समाधान के लिए धन्यवाद, मैंने लागू किया है और यह ठीक काम कर रहा है। बस पुष्टि करने के लिए, sizeआउटपुट बाइट्स में है?
केदार.आतवडेकर

3
जाहिरा तौर पर यह कम से कम थोड़ा जोखिम भरा है, यह निर्भर करता है कि पायथन कैसे लागू होता है #seek(): wiki.sei.cmu.edu/confluence/display/c/…
शरद ऋतु

72
import os


def convert_bytes(num):
    """
    this function will convert bytes to MB.... GB... etc
    """
    for x in ['bytes', 'KB', 'MB', 'GB', 'TB']:
        if num < 1024.0:
            return "%3.1f %s" % (num, x)
        num /= 1024.0


def file_size(file_path):
    """
    this function will return the file size
    """
    if os.path.isfile(file_path):
        file_info = os.stat(file_path)
        return convert_bytes(file_info.st_size)


# Lets check the file size of MS Paint exe 
# or you can use any file path
file_path = r"C:\Windows\System32\mspaint.exe"
print file_size(file_path)

परिणाम:

6.1 MB

5
this function will convert bytes to MB.... GB... etcगलत। यह फ़ंक्शन बाइट्स को MiB, GiB आदि में बदल देगा । इस पोस्ट को देखें ।
moi

2
पंक्ति 10 को return f'{num:.1f} {x}'पायथन> = 3.5 में बदला जा सकता है ।
मैट एम।

53

उपयोग करना pathlib( पायथन 3.4 में जोड़ा गया या PyPI पर उपलब्ध एक बैकपोर्ट ):

from pathlib import Path
file = Path() / 'doc.txt'  # or Path('./doc.txt')
size = file.stat().st_size

यह वास्तव में केवल एक इंटरफ़ेस है os.stat, लेकिन pathlibअन्य संबंधित फ़ाइल तक पहुँचने के लिए एक आसान तरीका प्रदान करता है।


18

bitshiftअगर मैं bytesकिसी अन्य इकाई से परिवर्तित करना चाहता हूं तो एक चाल है जिसका मैं उपयोग करता हूं । यदि आप अपने द्वारा एक सही शिफ्ट करते हैं 10तो मूल रूप से इसे एक ऑर्डर (कई) द्वारा शिफ्ट करते हैं।

उदाहरण: 5GB are 5368709120 bytes

print (5368709120 >> 10)  # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)

9
इस सवाल का जवाब नहीं है। सवाल एक फ़ाइल के आकार को खोजने के बारे में है, न कि मानव उपभोग के लिए परिणाम स्वरूपण के बारे में।
विल मनाली

1
ये संख्या गलत है और इस प्रकार भ्रामक है। 5GB 5e9 बाइट्स है। क्या यह किसी प्रकार का मानव-पठनीय सन्निकटन माना जाता है? आप भी ऐसा कुछ कहां इस्तेमाल करेंगे?
Dre

1-बिट => 2 ... 2-बिट्स => 4 ... 3-बिट्स => 8 ... 4-बिट्स => 16 ... 5-बिट्स => 32 ... 6-बिट्स => 64 ... 7-बिट्स => 128 ... 8-बिट्स => 256 ... 9-बिट्स => 512 ... 10-बिट्स => 1024 ... 1024 बाइट्स 1kB ... => 20 -बिट्स>> 1024 * 1024 = 1,048,576bytes, जो 1024kB है, और 1MB ... => 30-बिट्स => 1024 * 1024 * 1024 = 1,073,741,824 बाइट्स, जो 1,048,576 kB, और 1024MB, और 1GB ... आप भ्रमित हो गए हैं। कंप्यूटिंग में उपयोग किए जाने वाले बाइनरी / बेस -2 प्रतिनिधित्व के साथ वैज्ञानिक संकेतन और दशमलव स्थान। 5x9 = 5 x 10 ^ 9 = 5,000,000,000
जेम्स 'शराबी' बर्टन

3
दोस्तों, उसने कुछ भी भ्रमित नहीं किया है ... उसे सिर्फ एक अनुमान दिया गया है, जो स्पष्ट है जब वह "मूल रूप से" कहता है। 2 ^ 10 लगभग है। 10 ^ 3। वास्तव में, इस सन्निकटन इतना आम है कि इसका एक नाम है : Mebi , Gibi , और Tebi मेगा, गीगा, और तेरा कर रहे हैं, क्रमशः। प्रश्न का उत्तर नहीं देने के संबंध में, @WillManley, आपके पास एक उचित बिंदु है! ; -पी
माइक विलियमसन

9

प्रश्न पर सख्ती से चिपका, पायथन कोड (+ छद्म कोड) होगा:

import os
file_path = r"<path to your file>"
if os.stat(file_path).st_size > 0:
    <send an email to somebody>
else:
    <continue to other things>

-1
#Get file size , print it , process it...
#Os.stat will provide the file size in (.st_size) property. 
#The file size will be shown in bytes.

import os

fsize=os.stat('filepath')
print('size:' + fsize.st_size.__str__())

#check if the file size is less than 10 MB

if fsize.st_size < 10000000:
    process it ....

-1

हमारे पास दो विकल्प हैं दोनों में शामिल हैं ओएस मॉड्यूल आयात करना

1) os.stat () फ़ंक्शन के रूप में ओएस को आयात करता है जो एक ऑब्जेक्ट देता है जिसमें फ़ाइल हेडर और अंतिम संशोधित समय आदि सहित कई हेडर होते हैं .. उनमें से st_size () फ़ाइल का सटीक आकार देता है।

os.stat ( "फ़ाइल नाम")। st_size ()

2) इम्पोर्ट ओ एस। इसमें हमें सटीक फाइल पथ (निरपेक्ष पथ) प्रदान करना होता है, न कि कोई सापेक्षिक पथ।

os.path.getize ("फ़ाइल का पथ")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.