2013-05-14 10 views
7

मैं अजगर ट्यूटोरियल पर इस पढ़ें: (http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files)बाइनरी फाइलों से निपटने के लिए पाइथन खतरनाक है?

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

मुझे समझ में नहीं आता कि पाठ फ़ाइलों में अंतराल वर्णों को कैसे बदल दिया जाएगा 'भ्रष्ट बाइनरी डेटा' होगा। क्योंकि मुझे लगता है कि द्विआधारी डेटा में ऐसी चीजें नहीं हैं जैसे अंत-रेखाएं।

क्या कोई मेरे लिए इस अनुच्छेद के बारे में अधिक बता सकता है? यह मुझे महसूस कर रहा है जैसे पाइथन बाइनरी फाइलों का स्वागत नहीं करता है।

+4

यह "बाइनरी मोड का उपयोग करने के लिए ** बहुत सावधान रहें ...", "सावधान रहें ** जब आप ** बाइनरी मोड का उपयोग करते हैं ..."। बाइनरी मोड सुरक्षित है। – Matthias

उत्तर

14

आपको बस विंडोज़ पर फ़ाइलों को बाइनरी (open(filename, "rb")) के रूप में खोलने की देखभाल करना है, न कि पाठ फ़ाइलों के रूप में। इसके बाद डेटा का उपयोग करने में कोई समस्या नहीं है।

विशेष रूप से विंडोज़ पर अंतराल '\r\n' है। और यदि आप टेक्स्ट फ़ाइल के रूप में एक बाइनरी फ़ाइल पढ़ते हैं और उसे वापस लिखते हैं, तो '\n''\r\n' अनुक्रमों में परिवर्तित हो जाते हैं। यदि आप फ़ाइलों को बाइनरी (पढ़ने और लिखने के लिए) के रूप में खोलते हैं तो कोई ऐसी समस्या नहीं है।

पायथन बाइनरी डेटा से निपटने में सक्षम है, और आपको केवल विंडोज़ सिस्टम पर किसी भी भाषा में इस तरह की देखभाल करना होगा, न कि केवल पाइथन में (लेकिन पाइथन के डेवलपर्स आपको ओएस के बारे में चेतावनी देने के लिए पर्याप्त अनुकूल हैं समस्या का)। लिनक्स जैसी प्रणालियों में जहां अंत-रेखा एक एकल चरित्र है, यह भेद भी मौजूद है, लेकिन पाठ के रूप में बाइनरी डेटा को पढ़ने/लिखने में समस्या होने की संभावना कम होती है (यानी फाइलों को खोलने के लिए b विकल्प के बिना)।

+0

समझ गया। पाइथन (और कुछ अन्य भाषाएं) 'आर' का उपयोग करते समय दृश्य के पीछे विशेष पात्रों (अंत-रेखा) के साथ सौदा करती हैं। तो, बाइनरी फ़ाइल से निपटने के लिए टेक्स्ट मोड का उपयोग करना गलत है। –

2

मुझे लगता है कि द्विआधारी डेटा में ऐसी चीजें नहीं हैं जैसे अंत-रेखाएं।

बाइनरी फ़ाइलों में चरित्र \ n सहित उनमें से कोई भी संभावित चरित्र हो सकता है। आप नहीं चाहते कि अजगर किसी बाइनरी फ़ाइल में किसी और अक्षर को किसी अन्य रूप में परिवर्तित कर दे। पाइथन को पता नहीं है कि यह एक बाइनरी फ़ाइल पढ़ रहा है जबतक कि आप इसे नहीं बताते। और जब पाइथन एक टेक्स्ट फ़ाइल पढ़ता है तो यह स्वचालित रूप से किसी भी \ n चरित्र को ओएस के न्यूलाइन कैरेक्टर में परिवर्तित करता है, जो विंडोज़ पर \ r \ n है।

वैसे ही चीजें सभी कंप्यूटर प्रोग्रामिंग भाषाओं में काम करती हैं।

इसके बारे में सोचने का एक और तरीका यह है: फ़ाइल केवल बाइट्स (8 बिट्स) की एक लंबी श्रृंखला है। एक बाइट सिर्फ एक पूर्णांक है। और एक बाइट कोई पूर्णांक हो सकता है। यदि एक बाइट पूर्णांक 10 होता है, तो यह चरित्र \ n के लिए ascii कोड भी है। यदि फ़ाइल में बाइट बाइनरी डेटा का प्रतिनिधित्व करते हैं, तो आप नहीं चाहते हैं कि पाइथन 10 में पढ़े और इसे दो बाइट्स में परिवर्तित करें: 13 और 10. आमतौर पर जब आप बाइनरी डेटा पढ़ते हैं, तो आप पहले 2 बाइट्स को पढ़ना चाहते हैं, एक संख्या का प्रतिनिधित्व करता है, फिर अगले 4 बाइट्स जो एक और संख्या का प्रतिनिधित्व करते हैं, आदि .. जाहिर है, अगर पाइथन अचानक बाइट्स में से एक को दो बाइट्स में परिवर्तित कर देता है, तो इससे दो समस्याएं पैदा हो जाएंगी: 1) यह डेटा बदलती है, 2) आपके सभी डेटा सीमाएं गड़बड़ हो जाएगा।

एक उदाहरण: मान लीजिए कि फ़ाइल के पहले बाइट को कुत्ते के वजन का प्रतिनिधित्व करना चाहिए, और बाइट का मान 10 है। फिर अगला बाइट कुत्ते की उम्र का प्रतिनिधित्व करना चाहिए, और इसका मान 1 है। यदि पायथन बदल जाता है 10 है, जो \ n के लिए ascii कोड है दो बाइट के लिए,: 10 और 13 है, तो डेटा अजगर हाथ आप तरह दिखेगा:

और आप के लिए दूसरी बाइट निकालने जब कुत्ते की उम्र, आपको 13 मिलते हैं -

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

1

मुझे लगता है कि पाइथन मैनुअल में "थोड़ा बदलाव" का अर्थ है यूनिक्स एंड-ऑफ-लाइन वर्णों को विंडोज एंड-ऑफ-लाइन वर्णों में कनवर्ट करना। क्योंकि यह केवल विंडोज़ में किया जाता है, इसलिए यूनिक्स और लिनक्स को यह समस्या नहीं है।

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