2009-12-08 8 views
10

एक ऐसी फाइल है जिसे मैं सुनिश्चित करना चाहता हूं कि 2 जीबी से बड़ा न हो (क्योंकि यह एक सिस्टम पर चलाना चाहिए जो ext 2 का उपयोग करता है)। फ़ाइल के आकार को जांचने का एक अच्छा तरीका क्या है कि मैं इस फ़ाइल में चेक के बीच लिख रहा हूं? विशेष रूप से, क्या मुझे buffered, unflushed परिवर्तनों के बारे में चिंता करने की ज़रूरत है जिन्हें अभी तक डिस्क पर नहीं लिखा गया है?मैं पायथन में एक खुली फ़ाइल का आकार कैसे निर्धारित करूं?

+2

वहाँ एक कारण है कि आप बस अपने आप फ़ाइल आकार का ट्रैक रखने नहीं कर सकता है - जो है, क्या आकार है जब आप इसे खोलने के लिए और एक काउंटर जब आप लिखते हैं बढ़ाने के देख ?विशेष रूप से सुरुचिपूर्ण नहीं है, लेकिन यह काम करना चाहिए। –

+0

मुझे लगता है कि यह एक संभावना है जिसके बारे में मैंने सोचा नहीं था ... मैं भी कोशिश कर सकता हूं। –

+0

क्या यह नरक के रूप में अक्षम नहीं है? –

उत्तर

4

आप कुछ इस तरह से शुरू कर सकता है:

class TrackedFile(file): 
    def __init__(self, filename, mode): 
     self.size = 0 
     super(TrackedFile, self).__init__(filename, mode) 
    def write(self, s): 
     self.size += len(s) 
     super(TrackedFile, self).write(s) 

तो फिर तुम इसे इस तरह इस्तेमाल कर सकते हैं:

>>> f = TrackedFile('palindrome.txt', 'w') 
>>> f.size 
0 
>>> f.write('A man a plan a canal ') 
>>> f.size 
21 
>>> f.write('Panama') 
27 

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

यह एन्कोडिंग की परवाह किए बिना काम करता है, क्योंकि तार केवल बाइट्स के अनुक्रम हैं।

>>> f2 = TrackedFile('palindrome-latin1.txt', 'w') 
>>> f2.write(u'A man a plan a canál '.encode('latin1') 
>>> f3 = TrackedFile('palindrome-utf8.txt', 'w') 
>>> f3.write(u'A man a plan a canál '.encode('utf-8')) 
>>> f2.size 
21 
>>> f3.size 
22 
+0

+1: यह वास्तव में चालाक विचार है। मुझें यह पसंद है! – jathanism

+0

यह वास्तव में नहीं है। यह आप ASCII, ISO1559 और UTF-8 का उपयोग करते हैं, परिणाम वही होगा, लेकिन डिस्क आकार पर नहीं होगा। –

+0

नहीं। यदि आप वास्तविक तारों का उपयोग करते हैं, तो यह अन्य एन्कोडिंग के लिए भी काम करता है। प्रदर्शित करने के लिए संशोधित उत्तर। – jcdyer

15

शायद आप जो चाहते हैं उसे नहीं, लेकिन मैं इसे वैसे भी सुझाव दूंगा।

import os 
a = os.path.getsize("C:/TestFolder/Input/1.avi") 

वैकल्पिक रूप से एक खोला फ़ाइल के लिए आप fstat समारोह है, जो एक खोला फ़ाइल पर इस्तेमाल किया जा सकता का उपयोग कर सकते हैं। यह एक पूर्णांक फ़ाइल हैंडल, नहीं एक फ़ाइल वस्तु लगता है, इसलिए फ़ाइल वस्तु पर fileno विधि का उपयोग करने के लिए है:

a = open("C:/TestFolder/Input/1.avi") 
b = os.fstat(a.fileno()).st_size 
2

सबसे विश्वसनीय एक रैपिंग वर्ग जो फ़ाइल के आकार की जाँच करेगा जब आप इसे खोलने बनाने होगा, ट्रैक लिखें और संचालन की तलाश करें, उन परिचालनों के आधार पर वर्तमान आकार की गणना करें और आकार सीमा से अधिक रोकें।

2

या, फ़ाइल पहले से ही खुला है यदि:

>>> fsock = open('/etc/hosts', 'rb').read() 
>>> len(fsock) 
444 

कितने बाइट्स फ़ाइल है कि।

6

os.fstat(file_obj.fileno()).st_size चाल चलाना चाहिए। मुझे लगता है कि यह लिखित बाइट वापस करेगा। यदि आप बफरिंग के बारे में चिंतित हैं तो आप हमेशा हाथ से फ्लश कर सकते हैं।

+0

और संलग्न मोड में भी काम करता है! धन्यवाद। और हाँ, मैं इसे बुलाए जाने से पहले फ्लश करूंगा। –

4

मैं अजगर से परिचित नहीं हूं, लेकिन स्ट्रीम ऑब्जेक्ट नहीं है (या फ़ाइल खोलते समय आपको जो भी मिलता है) में ऐसी संपत्ति होती है जिसमें स्ट्रीम की वर्तमान स्थिति होती है?

ftell() सी फ़ंक्शन, या Stream.Position .NET में आपको जो मिलता है उसके समान।

जाहिर है, यह केवल तभी काम करता है जब आप स्ट्रीम के अंत में स्थित हैं, जो आप हैं यदि आप वर्तमान में इसे लिख रहे हैं।

इस दृष्टिकोण का लाभ यह है कि आपको फ़ाइल को बंद करने या unflushed डेटा के बारे में चिंता करने की आवश्यकता नहीं है।

+0

'filehandle.tell()' वास्तव में खुली फ़ाइल में बाइट्स की संख्या दिखाता है, और या तो लिखने या संलग्न मोड में काम करता है। निश्चित नहीं है कि इन सभी जटिल उत्तरों को क्यों उखाड़ फेंक दिया गया। – hurfdurf

+1

@hurfdurf नहीं, 'f.tell() 'परिशिष्ट मोड में भरोसेमंद काम नहीं कर रहा है। जब तक आप पहले 'f.seek (0,2) '। मुझे कोई जानकारी नहीं है की क्यों। –

4

हालांकि यह एक पुराना सवाल है, मुझे लगता है कि इसाक का सबसे सरल समाधान है। यहाँ कैसे पायथन में यह करना है:

# Assuming f is an open file 
>>> pos = f.tell() # Save the current position 
>>> f.seek(0, 2) # Seek to the end of the file 
>>> length = f.tell() # The current position is the length 
>>> f.seek(pos) # Return to the saved position 
>>> print length 
1024 
+0

मुझे लगता है कि पहली पंक्ति में (वर्तमान स्थिति को सहेजें), आपको f.tell() का उपयोग करना चाहिए, नहीं(), जो अपवाद का कारण बनता है क्योंकि() को कम से कम 1 तर्क की आवश्यकता होती है। – Jkm

+0

@ जेकेएम हाँ, आप सही हैं! यकीन नहीं है कि मैं इसे कैसे चूक गया। धन्यवाद! – Trenton

+0

यह फ़ाइल आकार की सही गणना करेगा, लेकिन ज्ञात समस्याओं के कारण स्थिति को सही ढंग से पुनर्स्थापित नहीं करेगा [संलग्न मोड में बताएं] (https://stackoverflow.com/questions/31680677/)। –

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