2011-11-03 23 views
58

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

पी। इस प्रश्न के साथ stackoverflow पर भ्रमित नहीं होना चाहिए: StringIO Usage जो स्ट्रिंग और स्ट्रिंगआईओ की तुलना करता है।

उत्तर

75

इसका उपयोग तब किया जाता है जब आपके पास कुछ एपीआई होती है जो केवल फाइलें लेती है, लेकिन आपको एक स्ट्रिंग का उपयोग करने की आवश्यकता होती है। उदाहरण के लिए, अजगर 2 में एक स्ट्रिंग gzip मॉड्यूल का उपयोग कर संपीड़ित करने के लिए:

import gzip 
import StringIO 

stringio = StringIO.StringIO() 
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w') 
gzip_file.write('Hello World') 
gzip_file.close() 

stringio.getvalue() 
+0

दूसरे शब्दों में: 'बतख typing': डी – Abdelouahab

+1

अजगर 3.2 के बाद से, gzip मॉड्यूल कार्यों सीधे डेटा को संपीड़ित है। (लेकिन वर्तमान में किसी भी ज्ञात ओपन-सोर्स लाइब्रेरी की आवश्यकता है जिसे स्ट्रिंगियो की आवश्यकता है, शायद कुछ समय बाद इस तरह के कार्यों को बढ़ाएगा, इसलिए एक नया उदाहरण खोजने के बजाय मैं यहां gzip छोड़ दूंगा।) –

27

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

उदाहरण के लिए, कहें कि आपके पास एक लॉगर है जो फाइल को चीजें लिखता है और आप नेटवर्क पर लॉग आउटपुट भेजना चाहते हैं। आप फ़ाइल को पढ़ सकते हैं और नेटवर्क पर अपनी सामग्री लिख सकते हैं, या आप एक स्ट्रिंगियो ऑब्जेक्ट पर लॉग लिख सकते हैं और फाइल सिस्टम को छूए बिना इसे अपने नेटवर्क गंतव्य पर भेज सकते हैं। स्ट्रिंगियो इसे पहली तरह से करना आसान बनाता है फिर दूसरी तरफ स्विच करें।

12

मामलों में आप किसी फ़ाइल जैसी वस्तु है कि एक फ़ाइल की तरह काम करता चाहते हैं, लेकिन एक में स्मृति स्ट्रिंग बफर लिए लिख रहा है: StringIO उपकरण है यदि आप सादे-पाठ दस्तावेज़ों जैसे बड़े तारों का निर्माण कर रहे हैं, और बहुत सी स्ट्रिंग कॉन्सटेनेशन कर रहे हैं, तो आपको mystr += 'more stuff\n' संचालन के प्रकार के बजाय स्ट्रिंगियो का उपयोग करना आसान हो सकता है।

+1

मुझे 'स्ट्रिंगियो' भी मिला है यदि आप 'mystr + = "जैसे अभिव्यक्तियों की तुलना में अधिक मेगाबाइट्स वर्ण-डेटा के साथ काम कर रहे हैं तो बहुत तेजी से \ n" 'एक लूप के भीतर, विशेष रूप से यदि आप' io.StringIO 'के बजाय' cStringIO.StringIO' का उपयोग कर सकते हैं '। – SeldomNeedy

8

बातें मैं व्यक्तिगत रूप में इसका उपयोग किया की युगल:

  1. पूरे फ़ाइल कैशिंग। मेरे पास एक स्क्रिप्ट है जो पीडीएफ पढ़ती है और उनके बारे में विभिन्न चीजों की पुष्टि करता है। मैं जिस पीडीएफ लाइब्रेरी का उपयोग कर रहा हूं वह अपने दस्तावेज़ कन्स्ट्रक्टर में एक खुली फ़ाइल लेता है। मैंने मूल रूप से केवल पीडीएफ खोला जिसे मुझे पढ़ने में दिलचस्पी थी, हालांकि जब मैंने इसे पूरी फाइल को स्मृति में एक बार पढ़ने के लिए बदल दिया, तो पीडीएफ लाइब्रेरी में एक स्ट्रिंगियो ऑब्जेक्ट पास कर दिया, मेरी लिपि का चलने का समय आधे में कट गया।

  2. डिफरर्ड प्रिंटिंग। वही स्क्रिप्ट प्रत्येक पीडीएफ पढ़ने से पहले एक शीर्षलेख मुद्रित करती है। हालांकि, मैं कमांड लाइन पर निर्दिष्ट कर सकता हूं कि कुछ कॉन्फ़िगरेशन फ़ाइल में मौजूद परीक्षणों को अनदेखा करना है या केवल कुछ को शामिल करना है। अगर मैं को सभी किसी दिए गए पीडीएफ के लिए परीक्षणों को अनदेखा करता हूं, तो मैं हेडर मुद्रित नहीं करना चाहता हूं, लेकिन मुझे नहीं पता कि मैं परीक्षणों को चलाने तक कितने परीक्षण चलाता हूं (परीक्षणों को गतिशील रूप से भी परिभाषित किया जा सकता है)। तो मैं इसे इंगित करने के लिए sys.stdout बदलकर हेडर को एक स्ट्रिंगियो ऑब्जेक्ट में कैप्चर करता हूं, और प्रत्येक बार जब मैं परीक्षण चलाता हूं तो मैं यह देखने के लिए जांच करता हूं कि उस ऑब्जेक्ट में कुछ भी है या नहीं। यदि ऐसा है, तो मैं इसे प्रिंट करता हूं और इसे खाली पर रीसेट करता हूं। वोला, केवल पीडीएफ जिनमें परीक्षण हैं, शीर्षलेख मुद्रित हैं।

7

मैं सिर्फ दो बातों के लिए व्यवहार में StringIO उपयोग किया है: एक स्क्रिप्ट है कि, print आईएनजी का एक बहुत करता है आसान विश्लेषण के लिए एक StringIO उदाहरण के लिए sys.stdout पुनः निर्देशित द्वारा

  • इकाई परीक्षण करने के लिए;
  • ElementTree का उपयोग करके गारंटीकृत अच्छी तरह से गठित XML दस्तावेज़ (एक कस्टम API अनुरोध) बनाने के लिए और फिर write HTTP कनेक्शन के माध्यम से भेजने के लिए।

कि आप StringIOअक्सर की जरूरत नहीं, लेकिन कभी कभी यह बहुत उपयोगी है।

0

Django का फ़ंक्शन call_command है जिसका प्रबंधन प्रबंधन आदेशों को कॉल करने के लिए उपयोग किया जाता है। यह फ़ंक्शन आउटपुट को stdout प्रिंट करता है और कोई मान वापस नहीं करता है। अगर आप जानना चाहते हैं कि आदेश सफलतापूर्वक चलाया गया है या नहीं, तो आपको आउटपुट में देखना होगा और फैसला करना होगा।

स्ट्रिंगियो का उपयोग करके, आप आउटपुट कैप्चर कर सकते हैं और जांच सकते हैं कि यह वांछित आउटपुट है या नहीं।

with io.StringIO() as output: 
    call_command('custom_command', stdout=output) 
    if 'Success' not in output.getvalue(): 
     print('Custom command failed...') 
संबंधित मुद्दे