2008-11-12 14 views
40

क्या वर्तमान में खुली फ़ाइल ऑब्जेक्ट का आकार ढूंढने का कोई तरीका है?एक खुली फ़ाइल वस्तु का आकार

विशेष रूप से, मैं टैरिफाइल बनाने के लिए टैरिफाइल मॉड्यूल के साथ काम कर रहा हूं, लेकिन मैं नहीं चाहता कि मेरा टैरिफाइल एक निश्चित आकार से अधिक हो। जहां तक ​​मुझे पता है, टैरिफाइल ऑब्जेक्ट्स फ़ाइल जैसी वस्तुएं हैं, इसलिए मुझे लगता है कि एक सामान्य समाधान काम करेगा।

उत्तर

66
$ ls -la chardet-1.0.1.tgz 
-rwxr-xr-x 1 vinko vinko 179218 2008-10-20 17:49 chardet-1.0.1.tgz 
$ python 
Python 2.5.1 (r251:54863, Jul 31 2008, 22:53:39) 
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('chardet-1.0.1.tgz','rb') 
>>> f.seek(0,2) 
>>> f.tell() 
179218L 

उदाहरण

>>> import os 
>>> os.fstat(f.fileno()).st_size 
179218L 
>>>   
+0

http://docs.python.org/library/stat.html#stat.ST_SIZE 'os.fstat' वापसी' stat' संरचना, कृपया 'st_size' – shevski

+1

का उपयोग करें क्या कोई व्यक्ति 'f' के जादू पर कुछ प्रकाश डाल सकता है .seek (0,2) '? इसके बिना 'बताएं') क्यों 0 देता है? –

+3

@m_poorUser 'f.seek (0, 2) 'फ़ाइल ऑब्जेक्ट की स्थिति को फ़ाइल के अंत से 0 बाइट्स पर ले जाता है, इसलिए फ़ाइल ऑब्जेक्ट की स्थिति फ़ाइल के अंत में होती है। फिर, 'f.tell()' वर्तमान फ़ाइल ऑब्जेक्ट की स्थिति देता है, जो इस मामले में फ़ाइल का आकार है। Https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects – EarlCrapstone

4

यदि आपके पास फ़ाइल डिस्क्रिप्टर है, तो आप आकार, यदि कोई हो, तो fstat का उपयोग कर सकते हैं। एक और सामान्य समाधान फ़ाइल के अंत की तलाश करना है, और वहां अपना स्थान पढ़ना है।

7

ठीक है, फ़ाइल वस्तु का समर्थन करता है, तो बताई विधि, आप कर सकते हैं करने के लिए ChrisJY के विचार जोड़ना:

current_size = f.tell() 

बता देंगे कि तुम थे यह वर्तमान में है लिख रहे हैं। यदि आप अनुक्रमिक तरीके से लिखते हैं तो यह फ़ाइल का आकार होगा।

अन्यथा, आप फाइल सिस्टम क्षमताओं का उपयोग कर सकते हैं, यानी os.fstat दूसरों द्वारा सुझाए गए अनुसार।

+0

'current_size' एक खराब चर नाम है क्योंकि इसका अर्थ फ़ाइल का * वर्तमान आकार * है। 'बताएं()' फ़ाइल स्ट्रीम की वर्तमान स्थिति देता है - यानी, जहां अगला पढ़ा/लिखना होगा। – IAbstract

+1

पायथन 3.6 डॉक्टर के अनुसार, '.tell() वर्तमान स्ट्रीम स्थिति को अपारदर्शी संख्या के रूप में वापस कर दें। संख्या आमतौर पर अंतर्निहित बाइनरी स्टोरेज में कई बाइट्स का प्रतिनिधित्व नहीं करती है – Devy

1

एक और समाधान स्ट्रिंगियो का उपयोग कर रहा है "यदि आप मेमोरी ऑपरेशंस कर रहे हैं"।

with open(file_path, 'rb') as x: 
    body = StringIO() 
    body.write(x.read()) 
    body.seek(0, 0) 

अब bodybody.read() जैसे विभिन्न विशेषताओं के साथ एक फ़ाइल वस्तु की तरह व्यवहार करता है।

body.len फ़ाइल का आकार देता है।

संबंधित मुद्दे