2013-01-24 32 views
12

मुझे निम्न स्तर की भाषाओं में मामलों को याद करना प्रतीत होता है जो एक प्रोग्राम में एक से अधिक बार फ़ाइल खोलने के परिणामस्वरूप एक साझा खोज सूचक हो सकता है। चारों ओर अजगर में थोड़ा खिलवाड़ रूप से, यह मेरे लिए हो रहा हो प्रतीत नहीं होता:क्या Python में एक बार में कई बार फ़ाइल खोलना सुरक्षित है?

$ cat file.txt 
first line! 
second 
third 
fourth 
and fifth 
>>> f1 = open('file.txt') 
>>> f2 = open('file.txt') 
>>> f1.readline() 
'first line!\n' 
>>> f2.read() 
'first line!\nsecond\nthird\nfourth\nand fifth\n' 
>>> f1.readline() 
'second\n' 
>>> f2.read() 
'' 
>>> f2.seek(0) 
>>> f1.readline() 
'third\n' 

इस व्यवहार सुरक्षित माना जाता है? मुझे एक स्रोत खोजने में कठिनाई हो रही है कि यह ठीक है, और अगर मैं इस पर निर्भर हो सकता हूं तो इससे बहुत मदद मिलेगी।

मैं फ़ाइल ऑब्जेक्ट की विशेषता के रूप में स्थिति नहीं देख रहा हूं, अन्यथा मुझे इसमें अधिक विश्वास होगा। मुझे पता है कि इसे इटरेटर में आंतरिक रूप से रखा जा सकता है, लेकिन उस मामले में idk कैसे .tell() प्राप्त होगा।

>>> dir(f1) 
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', 
'__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__str__', 'close', 'closed', 'encoding', 'fileno', 'flush', 
'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 
'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 
'xreadlines'] 

अद्यतन
पृष्ठ पर The Python Essential Reference के 161 यह कहा गया

एक ही फाइल (या अलग अलग कार्यक्रमों में) एक ही कार्यक्रम में एक से अधिक बार खोला जा सकता है। खुली फ़ाइल के प्रत्येक उदाहरण में अपना फ़ाइल पॉइंटर होता है जिसे स्वतंत्र रूप से छेड़छाड़ की जा सकती है।

तो यह परिभाषित व्यवहार

+0

पाइथन में प्रत्येक बार जब आप 'ओपन()' कहते हैं तो यह एक नई फ़ाइल ऑब्जेक्ट (इटरेटर) बनाता है, इसलिए आप सुरक्षित हैं। –

+1

मुझे किसी भी प्लेटफ़ॉर्म के बारे में पता नहीं है जहां आपको यहां विभिन्न खोज पॉइंटर्स बनाए रखने में समस्या हो सकती है। लेकिन ... क्या यह आपके उपयोग के मामले के लिए स्वीकार्य है कि आपका कोड विंडोज़ पर कुछ मामलों में अपवाद खोलने 'एफ 2' बढ़ा सकता है, भले ही यह यूनिक्स पर कभी विफल न हो? – abarnert

+0

@abarnert I केवल यह विंडोज़ पर कभी भी चलाने की उम्मीद करता है, और केवल पढ़ने पर ही। विंडोज़ पर खुलने से सामान्य लॉक सामान्य रूप से प्राप्त होंगे? –

उत्तर

7

एक आधुनिक ओएस पर (पोस्ट 1969 UNIX- जैसे OS के लिए, या पोस्ट-2000 विंडोज के लिए, करने के लिए वास्तव में सुरक्षित हो रहा है और शायद उस से पहले, लेकिन मैं कर रहा हूँ Win2K को पहली "आधुनिक" विंडोज़ के रूप में गिनती है), एक खुली फ़ाइल (फ़ाइल डिस्क्रिप्टर) के प्रत्येक उदाहरण के पास अपनी खोज सूचक है। पायथन के file वर्ग में कोई जादू नहीं है जो राज्य को साझा करने के उदाहरण देगा; file एक सामान्य सी फ़ाइल हैंडल के लिए एक रैपर है, जो स्वयं ओएस फ़ाइल डिस्क्रिप्टर को एन्सेप्लेट करता है, और file.tell() और file.seek() के कार्यान्वयन को संबंधित सी stdio फ़ंक्शंस को कॉल करता है। (गन्दा विवरणों के लिए सीपीथॉन के fileobject.c देखें।) सी लाइब्रेरी व्यवहार और अंतर्निहित ओएस के व्यवहार के बीच मतभेद हो सकते हैं, लेकिन इस विशेष मामले में यह कारक नहीं है।

यदि आप आयरनपीथन या ज्योथन का उपयोग कर रहे हैं, तो यह मानक अंतर्निहित कार्यान्वयन के लिए मानक नेट या जावा फ़ाइल ऑब्जेक्ट का उपयोग करने जा रहा है, जो बदले में मानक सी लाइब्रेरी या ओएस कार्यान्वयन का उपयोग करने जा रहा है।

तो आपका दृष्टिकोण ठीक है जब तक कि आप किसी भी तरह से गैर-मानक ओएस पर विचित्र I/O व्यवहार के साथ पाइथन चला रहे हों।

यदि आप समय-समय पर फ्लश नहीं करते हैं तो आपको अनपेक्षित परिणाम मिल सकते हैं; डेटा वास्तव में डिस्क को हिट करने से पहले कुछ समय के लिए स्मृति में लटका सकता है और उसी फ़ाइल पर आपके द्वारा खोले गए अन्य फ़ाइल डिस्क्रिप्टरों के लिए उपलब्ध है। जैसा कि एक टिप्पणी में अबाउटर्ट इंगित करता है, वैसे ही यह बहुत ही सरल मामलों को छोड़कर समस्याग्रस्त है।

+0

यदि आप केवल पढ़ने के लिए सभी फाइलें खोलते हैं, तो "फ्लश" समस्या कभी नहीं आती है। और यदि आप केवल पढ़ने के लिए सभी फ़ाइलों को नहीं खोलते हैं, तो आपको और गंभीर समस्याएं मिलेंगी। – abarnert

+2

अधिक महत्वपूर्ण बात यह है कि यहां अधिकांश विवरण गलत हैं। एक सामान्य फ़ाइल वर्णनकर्ता के लिए 'file' _not_ एक रैपर है; यह 'फ़ाइल *' के लिए एक रैपर है। और 'बताएं 'और' तलाश 'सीधे निम्न स्तर के ओएस कार्यों के माध्यम से कॉल नहीं करते हैं; वे संबंधित मध्य-स्तर 'stdio' कार्यों को कॉल करते हैं। और यह विंडोज पर बहुत बड़ा अंतर बनाता है, क्योंकि नियमों के लिए नियम, उदाहरण के लिए, 'लॉन्च' बनाम 'CreateFile' में फ़ाइल लॉकिंग कार्य पूरी तरह से अलग हैं। – abarnert

+0

सुधार के लिए धन्यवाद। – kindall