2010-11-03 15 views
6

मेरे पास print कॉल का एक गुच्छा है जिसे मुझे stdout के बजाय फ़ाइल में लिखने की आवश्यकता है। (मुझे stdout की आवश्यकता नहीं है।)पायथन में एक फ़ाइल को प्रिंट करना: रीडायरेक्ट बनाम प्रिंट की फ़ाइल तर्क बनाम

मैं तीन दृष्टिकोणों पर विचार कर रहा हूं। क्या उनमें से किसी के लिए कोई लाभ (प्रदर्शन सहित) हैं?

पूर्ण रीडायरेक्ट, जो मैं here देखा:

import sys 

saveout = sys.stdout 
fsock = open('out.log', 'w') 
sys.stdout = fsock 

print(x) 
# and many more print calls 

# later if I ever need it: 
# sys.stdout = saveout 
# fsock.close() 

प्रत्येक प्रिंट बयान में पुनर्निर्देशित:

fsock = open('out.log', 'w') 
print(x, file = fsock) 
# and many more print calls 

लिखें समारोह:

fsock = open('out.log', 'w') 
fsock.write(str(x)) 
# and many more write calls 
+0

यदि आप py3k पढ़ रहे हैं [diveintopython 3] (http://diveintopython3.org/) – SilentGhost

+0

यह जोड़ना भूल गया कि मैंने कुछ समय पहले एक संबंधित प्रश्न पूछा था। http://stackoverflow.com/questions/4090652/where-to-store-a-log-file-name-in-python – max

+0

संदेह में, प्रोफ़ाइल। http://docs.python.org/py3k/library/profile.html –

उत्तर

6

मुझे इन दृष्टिकोणों के बीच किसी भी टिकाऊ प्रदर्शन अंतर की उम्मीद नहीं होगी।

पहला दृष्टिकोण का लाभ यह है कि किसी भी उचित रूप से अच्छी तरह से व्यवहार किया गया कोड जिसे आप भरोसा करते हैं (मॉड्यूल आप आयात करते हैं) स्वचालित रूप से आपकी वांछित पुनर्निर्देशन उठाएंगे।

दूसरे दृष्टिकोण का कोई फायदा नहीं है। यह केवल डीबगिंग या फेंकने के लिए उपयुक्त है ... और इसके लिए भी एक अच्छा विचार नहीं है। आप अपने आउटपुट फैसलों को कुछ अच्छी तरह से परिभाषित स्थानों में समेकित करना चाहते हैं, जो प्रत्येक कॉल में print() पर आपके कोड में बिखरे हुए नहीं हैं। Python3 print() में एक कथन के बजाय एक कार्य है। यदि आप चाहें तो यह आपको फिर से परिभाषित करने की अनुमति देता है। तो यदि आप चाहें तो def print(*args) कर सकते हैं। उदाहरण के लिए, यदि आप अपने स्वयं के कस्टम print() की परिभाषा के भीतर, इसे __builtins__.print() पर भी कॉल कर सकते हैं।

तीसरा दृष्टिकोण ... और विस्तार से सिद्धांत यह है कि आपके सभी आउटपुट विशिष्ट कार्यों और वर्ग विधियों में उत्पन्न किए जाने चाहिए जिन्हें आप उस उद्देश्य के लिए परिभाषित करते हैं ... शायद सबसे अच्छा है।

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

उदाहरण के लिए मेरे पास एक से अधिक अवसर हैं जहां मैंने कुछ जटिल प्रश्नों और डेटा को विभिन्न स्रोतों से एकत्रित करने और रिपोर्ट प्रिंट करने के लिए लिखा था ... विसंगतियों का कहना है ... बाद में इसे अनुकूलित करने की आवश्यकता है फॉर्म जो कुछ रूपों (जैसे वाईएएमएल/जेएसओएन) में डेटा थूक सकता है जिसे किसी अन्य सिस्टम में खिलाया जा सकता है (कहें, दूसरे डेटा के खिलाफ एक डेटा स्रोत को सुलझाने के लिए।

यदि, शुरुआत से, आप मुख्य रखते हैं आउटपुट और स्वरूपण से अलग ऑपरेशन तब इस प्रकार के अनुकूलन अपेक्षाकृत आसान होते हैं। अन्यथा इसमें काफी रिफैक्टरिंग (कभी-कभी एक पूर्ण पुनः लिखने के लिए टैंटमाउंट) होती है।

4

फ़ाइल नाम आप में उपयोग कर रहे हैं से आपका प्रश्न, ऐसा लगता है कि आप लॉग फ़ाइल बनाना चाहते हैं। क्या आपने इसके बजाय पाइथन logging मॉड्यूल पर विचार किया है?

+0

ओपी के हालिया इतिहास को देखें – SilentGhost

+0

अंत में मैंने 'लॉगिंग' का उपयोग करने का निर्णय लिया। मेरे पास लिखने के लिए कई फाइलें हैं, और मुझे अपने आप को प्रबंधित करना आसान लगता है। लेकिन धन्यवाद, मैं इसे ध्यान में रखूंगा। – max

4

मुझे लगता है कि अर्थ विज्ञान imporant है:

मैं इस स्थिति के लिए पहले दृष्टिकोण सुझाव है कि जब आप एक ही सामान आप कंसोल पर प्रिंट होगा मुद्रण। सेमेन्टिक्स वही होंगे। अधिक जटिल परिस्थिति के लिए मैं मानक लॉगिंग मॉड्यूल का उपयोग करूंगा।

यदि आप टेक्स्ट लाइनों को प्रिंट कर रहे हैं तो दूसरा और तीसरा दृष्टिकोण थोड़ा अलग है। दूसरा दृष्टिकोण - print नई लाइन और write जोड़ता नहीं है।

मैं मुख्य रूप से बाइनरी या गैर-पाठ प्रारूप में तीसरा दृष्टिकोण का उपयोग करता हूं और मैं अन्य मामलों में प्रिंट स्टेटमेंट में रीडायरेक्ट का उपयोग करता हूं।

+1

+1: न्यूलाइन जानकारी। – max

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