2013-05-31 19 views
7

मैं पाइथन के लिए बिल्कुल नया नहीं हूं, लेकिन मुझे अभी भी कुछ समझने में परेशानी है जो कुछ "पायथनिक" (और बातचीत) बनाता है।पायथन में कोई लेन (फ़ाइल) क्यों नहीं?

तो मुझे माफ कर दो अगर यह एक बेवकूफ सवाल है, लेकिन मुझे एक लेन (फ़ाइल) करके फ़ाइल का आकार क्यों नहीं मिल सकता है?

फ़ाइल। __len__ भी कार्यान्वित नहीं किया गया है, इसलिए ऐसा नहीं है कि यह किसी और चीज़ के लिए जरूरी है? क्या यह किसी कारण से भ्रमित/असंगत होगा यदि इसे फ़ाइल आकार वापस करने के लिए लागू किया गया था?

+2

(1) अजगर में इंटरैक्टिव दुभाषिया निष्पादित 'आयात this'। (2) क्योंकि इसे लागू करने के लिए आपको फ़ाइल को इसके अंत में पढ़ने की आवश्यकता होगी। तो, आप ओएस से बेहतर तरीके से ऐसा करने के लिए कहेंगे (जैसे [इस SO सवाल] (http://stackoverflow.com/questions/6591931/getting-file-size-in-python)) – J0HN

+0

क्योंकि कोई आया था os.stat और statinfo.st_size – varun

उत्तर

10

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

sum(1 for line in file) 

पढ़ने की जरूरत है की खोज करें, os.stat

जैसे

import os 
os.stat(filename).st_size 
+0

ठीक है, इटेटरेटर चीज़ समझ में आता है। मुझे लगता है कि फ़ाइल के लिए '__len__' को कार्यान्वित करना है, इसे फ़ाइल को स्मृति में पढ़ना होगा और फिर बफर पर एक लेन() करना होगा। शायद एक अच्छा विचार नहीं है। तो आप ओएस से पूछ सकते हैं, जो पहले से ही फ़ाइल आकार जानता है, इसलिए os.stat। धन्यवाद! –

2

मैं कहेंगे क्योंकि लंबाई ढूंढना ओएस विशिष्ट कार्यक्षमता पर निर्भर करता है। आप इस कोड के साथ एक फ़ाइल की लंबाई पा सकते हैं:

import os os.path.getsize('C:\\file.txt')

तुम भी एक स्ट्रिंग में पूरे फ़ाइल को पढ़ने और स्ट्रिंग की लंबाई मिल सका। हालांकि आप यह सुनिश्चित करना चाहते हैं कि फ़ाइल एक विशाल आकार का नहीं है जो आपकी सभी मेमोरी खाएगी।

2

file पुनरावर्तक देता है, तो आप उस पर len() उपयोग नहीं कर सकते।

आप os.stat उपयोग कर सकते हैं एक फ़ाइल के आकार पाने के लिए:

>>> foo = os.stat("abc") 
>>> foo.st_size 
193L 

आप लाइन की संख्या मतलब आकार से तो इन की कोशिश:

len(open("abc").readlines()) 

या

sum (1 for _ in open("abc"))

+0

एक फ़ाइल एक इटरेटर है, हां, लेकिन इसमें कई विधियां हैं। – delnan

+0

'लेन (खुला (" एबीसी ")। रीडलाइन()) 'बहुत सुरुचिपूर्ण है, धन्यवाद। – PhysicalChemist

+0

पायथन 3 शिक्षार्थियों के लिए, "1 9 3 एल" का मतलब "1 9 3 लाइन" नहीं है, इसका मतलब यह है कि "1 9 3 एक बड़ी संख्या है"। – Noumenon

14

फ़ाइलों की एक विस्तृत परिभाषा है, खासकर यूनिक्स में, आप सोच सकते हैं की तुलना में। उदाहरण के लिए प्रिंटर की लंबाई क्या है? या एक सीडीरॉम ड्राइव? दोनों फाइलें/dev में हैं, और विंडोज़ में तरह हैं।

जो हम आम तौर पर फ़ाइल के रूप में सोचते हैं, उसकी लंबाई क्या होगी? चर का आकार? बाइट्स में फ़ाइल का आकार? उत्तरार्द्ध अधिक समझ में आता है, लेकिन फिर यह ickier हो जाता है। फ़ाइल की सामग्री का आकार सूचीबद्ध होना चाहिए, या डिस्क पर इसका आकार (मॉड्यूलस आवंटन इकाई आकार) होना चाहिए। प्रश्न फिर से स्पैस फाइलों के लिए उठता है (जिन फाइलों में बड़े रिक्त अनुभाग होते हैं जो कोई स्थान नहीं लेते हैं, लेकिन फाइल के सामान्य रूप से रिपोर्ट किए गए आकार का हिस्सा हैं, एनटीएफएस और एक्सएफएस जैसे कुछ फाइल सिस्टम द्वारा समर्थित)।

बेशक, उन सभी का जवाब हो सकता है, "बस एक चुनें और जो आपने चुना है उसे दस्तावेज करें।" शायद यह वही है जो किया जाना चाहिए, लेकिन पाइथोनिक होने के लिए, आमतौर पर बहुत सारे दस्तावेज़ों को पढ़ने के बिना स्पष्ट रूप से स्पष्ट होना चाहिए। len(string) अधिकतर स्पष्ट है (कोई पूछ सकता है कि बाइट्स या वर्ण वापसी मूल्य हैं), len(array) स्पष्ट है, len(file) शायद पर्याप्त नहीं है।

+2

के लिए खड़ा था यह मूल मुद्दा की एक अच्छी परीक्षा है, +1 – iruvar

+0

मूल्य यह है कि पायथन 3 में, 'str' (कोड बिंदुओं का अनुक्रम) और' बाइट्स '(ए के बीच मजबूत अंतर) बाइट्स का अनुक्रम) पायथन 2 में 'यूनिकोड'/'str' भेद की तुलना में यह स्पष्ट करता है कि प्रत्येक के लिए' __len__' कैसे परिभाषित किया जाना चाहिए। – chepner

+0

धन्यवाद, यह एक अच्छा जवाब है। मैंने अभी @gnibbler का समाधान दिया क्योंकि वह तकनीकी कारण बताते हैं कि '__len__' फ़ाइल के लिए अच्छा क्यों काम नहीं करेगा। –

4

तो मुझे माफ कर दो अगर यह एक बेवकूफ सवाल है, लेकिन मुझे एक लेन (फ़ाइल) करके फ़ाइल का आकार क्यों नहीं मिल सकता है?

चार्ल्स बर्न्स की तरह 'जवाब यूनिक्स के "सब कुछ एक फाइल है" दर्शन के बारे में एक अच्छा बिंदु बनाता है, और, यद्यपि आप हमेशा os.fstat() उपयोग कर सकते हैं पाने के लिए' किसी भी फाइल वर्णनकर्ता के लिए आकार 'कुछ के साथ, ...

import os 

f = open(anything) 
size = os.fstat(f.fileno()).st_size 

... यह कुछ भी सार्थक या उपयोगी नहीं लौटा सकते ...

>>> os.fstat(sys.stdout.fileno()).st_size 
0 
>>> fd1, fd2 = os.pipe() 
>>> os.fstat(fd1).st_size 
0 

मुझे लगता है कि कारण यह है कि एक अजगर फ़ाइल वस्तु या फ़ाइल जैसी वस्तु, एक धारा का प्रतिनिधित्व करने वाले है , और धाराओं डॉन स्वाभाविक रूप से लंबाई नहीं है, खासकर यदि वे केवल लिखते हैं, जैसे sys.stdout

आमतौर पर, केवल एक चीज आप कर सकते हैं एक अजगर फ़ाइल की तरह वस्तु के बारे में गारंटी है कि यह read() या write() कम से कम एक का समर्थन करेंगे, और कहा कि इसके बारे में।

1

को मापने के लिए वर्णों की संख्या होगी एक आसान तरीका:

file = open('file.bin', 'r') 
# Seek to the end. (0 bytes relative to the end) 
file.seek(0, 2) 
length = file.tell() 
संबंधित मुद्दे