2009-01-01 5 views
13

मैं निम्नलिखित फ़ाइल है पर chokes:लाइन पढ़ने 0x1A

abcde 
kwakwa 
<0x1A> 
line3 
linllll 

कहाँ <0x1A> 0x1A के हेक्स मान के साथ एक बाइट प्रतिनिधित्व करता है।

for line in open('t.txt'): 
    print line, 

यह केवल पहले दो लाइनों पढ़ता है, और पाश बाहर निकालता है: जब के रूप में अजगर में इस फ़ाइल को पढ़ने का प्रयास।

यह समाधान बाइनरी (या सार्वभौमिक न्यूलाइन मोड) - 'आरबी' या 'आरयू' में फ़ाइल को खोलने के लिए प्रतीत होता है। क्या आप इस व्यवहार को समझा सकते हैं?

+0

आप कैसे पता चलेगा कि बाइट का प्रतिनिधित्व किया <0x1A>। मेरे लिए यह सिर्फ कहते हैं notepadd में ++ – Programmer

+0

'उप' एक और काम के आसपास अजगर 3 या [ 'io.open()'] (https://docs.python.org/2/library/io.html उपयोग करने के लिए है # io.open) पायथन 2 में; 'io' फ़ाइल ऑब्जेक्ट्स हमेशा ओएस के संबंध में बाइनरी मोड में फ़ाइल का उपयोग करते हैं और इसलिए Windows समय-समय पर फ़ाइल को' समाप्त नहीं 'करेगा। –

उत्तर

28

0x1A Ctrl-Z है, और डॉस ऐतिहासिक रूप से इसका उपयोग अंततः फ़ाइल मार्कर के रूप में किया जाता है। उदाहरण के लिए, कमांड प्रॉम्प्ट का उपयोग करने का प्रयास करें, और अपनी फ़ाइल को "टाइप करें"। यह केवल सामग्री को Ctrl-Z प्रदर्शित करेगा।

पायथन विंडोज सीआरटी फ़ंक्शन _wfopen का उपयोग करता है, जो "Ctrl-Z EOF" semantics लागू करता है।

+0

अगर मैंने अपने तथ्यों की जांच नहीं की थी, तो मैं पहले हो सकता था! मैं असहाय क्रोध में अपनी मुट्ठी हिलाता हूँ! –

+0

लिनक्स के तहत, हालांकि, यह ठीक काम करता है। –

+0

मुझे याद दिलाता है कि मुझे एक बार लाटेक्स के साथ एक पोस्टस्क्रिप्ट दस्तावेज़ बनाना पड़ा जिसमें विंडोज़ पर पोस्ट की गई पोस्टस्क्रिप्ट छवियां शामिल थीं। मुझे आश्चर्य हुआ कि प्रिंटर ने पहली तस्वीर के बाद प्रिंटिंग क्यों बंद कर दी ... ठीक है, पोस्टस्क्रिप्ट चित्र फ़ाइलों में अंतिम बाइट 0x1A था। –

9

Ned बिल्कुल सही है।

यदि आपकी जिज्ञासा थोड़ा गहराई से चलती है, तो रूट कारण पीछे की तरफ संगतता को चरम पर ले जाता है। विंडोज डॉस के साथ संगत है, जो पाठ फ़ाइलों के लिए फ़ाइल मार्कर के वैकल्पिक अंत के रूप में Ctrl-Z का उपयोग करता है। आपको शायद यह नहीं पता कि डीओएस सीपी/एम के साथ संगत था, जो पीसी से पहले छोटे कंप्यूटरों पर लोकप्रिय था। सीपी/एम की फाइल सिस्टम ने बाइट स्तर पर फ़ाइल आकारों का ट्रैक नहीं रखा है, यह केवल फ्लॉपी डिस्क क्षेत्रों की संख्या से ट्रैक रखता है। यदि आपकी फ़ाइल 128 बाइट्स का सटीक एकाधिक नहीं था, तो आपको टेक्स्ट के अंत को चिह्नित करने के लिए एक तरीका चाहिए। This Wikipedia article का तात्पर्य है कि Ctrl-Z का चयन DEC द्वारा उपयोग किए जाने वाले पुराने पुराने सम्मेलन पर आधारित था।