पर फ़ाइल पढ़ें मैं X12 ईडीआई फ़ाइलों को संसाधित करने के लिए एक स्क्रिप्ट लिख रहा हूं, जिसे मैं लाइन-दर-रेखा को पुन: चालू करना चाहता हूं। फाइलें अलग-अलग अभिलेखों के अनुक्रम से बनी हैं, प्रत्येक को एक विशेष चरित्र द्वारा समाप्त किया गया है (उदा। ~
, लेकिन नीचे देखें)। फाइलें बड़ी हो सकती हैं (> 100 एमबी), इसलिए मैं पूरी चीज़ को पढ़ना और विभाजित नहीं करना चाहता हूं। रिकॉर्ड न्यूलाइन से अलग नहीं हैं; पहली पंक्ति में पढ़ने से शायद पूरी फाइल पढ़ी जाएगी। फाइलें सभी ASCII हैं।एक वर्ण
पायथन स्पष्ट रूप से एक निश्चित चरित्र तक फ़ाइल पढ़ने के लिए प्रदान करता है, बशर्ते वह चरित्र एक नई रेखा है। मैं एक मनमाना चरित्र के साथ एक ही काम करना चाहता हूँ। मुझे लगता है कि लाइन द्वारा पढ़ना बफरिंग के माध्यम से लागू किया जाता है। मैं अपने स्वयं के बफर किए गए पाठक को कार्यान्वित कर सकता हूं, लेकिन बेहतर समाधान होने पर मैं अतिरिक्त कोड और ओवरहेड से बचूंगा।
नोट: मैंने कुछ समान प्रश्न देखे हैं, लेकिन वे सभी निष्कर्ष निकालने लगते हैं कि किसी को लाइन में फ़ाइल को पढ़ना चाहिए, मान लीजिए कि रेखाएं उचित आकार होंगी। इस मामले में, पूरी फाइल शायद एक पंक्ति होगी।
संपादित करें: सेगमेंट टर्मिनेटर कैरेक्टर जो भी फाइल का 106 वां बाइट है। स्क्रिप्ट लागू होने से पहले यह ज्ञात नहीं है।
tr '~' '\n' < source.txt | my-script.py
फिर readline()
उपयोग करते हैं, readlines()
, या for line in file_object:
के रूप में उपयुक्त:
शायद फ़ाइल पॉइंटर पर '.read (some_reasonable_number)' का उपयोग करें और जब तक आप अपना '~' नहीं पाते, तब तक परिणाम के माध्यम से खोज करें, और यदि आप करते हैं, तो '.seek()' पीछे की ओर? – L3viathan
मेरा मानना है कि आप buffered पाठक के बारे में सही हैं, और दुर्भाग्यवश 'ओपन' में 'newline' तर्क' ~ 'की अनुमति नहीं देता है। –
मुझे डर है कि आपको एक io.BytesIO पर एक समर्पित कार्यान्वयन लिखना होगा, भाग में फ़ाइल पढ़ना होगा और वापस * लाइन * भेजना आपके साथ विशेष डेलीमीटर ... –