2011-12-22 13 views
27

वहाँ अजगर में किसी फ़ाइल के लिए लिखने के लिए कम से कम दो तरीके हैं:f.write प्रिंट बनाम >> च

f = open(file, 'w') 
f.write(string) 

या

f = open(file, 'w') 
print >> f, string 

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

+3

यह स्पष्ट होने के लिए पाइथोनिक है। '।लिखना() '' –

+5

से मेरा इरादा स्पष्ट रूप से व्यक्त करता है यदि मैं गलत हूं, तो मुझे सही करें, लेकिन नए पायथन (3.x) संस्करण प्रिंट के साथ एक * फ़ंक्शन * (विशेष वाक्यविन्यास कथन निर्माण नहीं) और इस प्रकार उत्तरार्द्ध उन पर भी काम नहीं करेगा? (मैंने वास्तव में पाइथन का उपयोग नहीं किया है ... 2.6ish।) –

+0

@pst: बहुत अच्छा बिंदु। 'लिखने()' विधि का उपयोग करने के लिए बेहतर है। – voithos

उत्तर

24

print चीजें file.write करता है, जो आपको कुछ मूलभूत चीज़ों के लिए स्ट्रिंग स्वरूपण को छोड़ने की अनुमति नहीं देता है।

यह तर्कों के बीच रिक्त स्थान सम्मिलित करता है और लाइन टर्मिनेटर को जोड़ता है।

print "a", "b" # prints something like "a b\n" 

यह __str__ या __repr__ एक वस्तु का विशेष तरीकों कॉल यह एक स्ट्रिंग में बदलने के लिए।

print 1 # prints something like "1\n" 

यदि आप file.write बजाय print इस्तेमाल किया मैन्युअल रूप से इन चीजों को करने के लिए होगा।

1

print पर प्रलेखन यह समझाने में मदद कर सकता है: print statement (पायथन 2.7 दस्तावेज)।

print, डिफ़ॉल्ट रूप से, मानक आउटपुट पर प्रिंट करता है, जो वास्तव में एक "फ़ाइल जैसी" वस्तु (sys.stdout) है। मानक आउटपुट में write() विधि है। print >> f का उपयोग करना एक अनावश्यक अमूर्त प्रतीत होता है।

इसके अलावा, यह मेरे लिए बहुत वर्बोज़ लगता है। f.write() ठीक है।

+0

में बिल्कुल काम नहीं करेगा सभी प्लेटफार्मों में नईलाइनें ('\ n') निरंतर हैं? जैसे मैं सिर्फ f.write (स्ट्रिंग + '\ n') का उपयोग कर सकता हूं और सभी प्लेटफॉर्म पर एक नई लाइन की उम्मीद कर सकता हूं? – oxuser

+0

जहाँ तक मुझे पता है, हाँ। पाइथन डिफ़ॉल्ट रूप से आपके लिए रूपांतरण करता है, हालांकि वांछित होने पर इसे ओवरराइड किया जा सकता है। – voithos

+0

@agf: आप त्रुटि में हैं। डिफ़ॉल्ट रूप से, पायथन "टेक्स्ट" मोड में फ़ाइलों को खोलता है और लिखते समय अंत-रेखा रूपांतरण को स्वचालित करता है। फ़ाइल को ओपन मोड में स्पष्ट रूप से "बी" जोड़ना होगा ताकि इसे बाइनरी मोड में न किया जा सके, बिना रूपांतरण के। – jsbueno

1

एक कपासलाइन के रूप में: फाइलों को लिखते समय फ़ाइल.write का उपयोग करें।

प्रिंटिंग के लिए ">>" मुहावरे को पायथन के प्रारंभिक दिनों में सी ++ से उधार लिया गया था, और यह अवांछित है - इतना है कि यह अब पायथन 3.x में मौजूद नहीं है - जहां कोई प्रिंट का उपयोग कर सकता है, अब इसके बजाय एक फ़ंक्शन एक बयान के लिए, एक फ़ाइल को लिखने के लिए - लेकिन इसके लिए कोई विशेष वाक्यविन्यास नहीं है।

अपने जवाब में @agf अंक के रूप में, फ़ाइल को लिखने के लिए "प्रिंट" का उपयोग करके, बस लिखने की तुलना में अधिक चीजें होती हैं - यह स्वचालित रूप से ऑब्जेक्ट का स्ट्रिंग प्रस्तुति प्राप्त करने के लिए str (obj) को कॉल करती है, जबकि लिखने की आवश्यकता होती है एक (बाइट) स्ट्रिंग को पैरामीटर के रूप में पारित किया जाना चाहिए - पायथन दुनिया में "स्पष्ट रूप से स्पष्ट है", इसलिए फ़ाइल के साथ जाने के लिए एक और अधिक उद्देश्य। लिखना।

+3

"निहित से स्पष्ट स्पष्ट है" *** नहीं होना चाहिए *** "निम्न स्तर के संचालन का उपयोग करें, उच्च स्तर के abstractions नहीं" के रूप में पढ़ा जाना चाहिए !! यह प्रिंट स्टेटमेंट का गहरा वाक्यविन्यास है जो एक समस्या है, * नहीं * कि यह एक सुविधाजनक पैकेज में आम तौर पर उपयोग किए जाने वाले एक साथ संचालन को बंडल करता है। – Ben

1

यह पसंदीदा तरीका है, संदर्भ संचालकों का उपयोग कर:

with open(file, 'w') as f: 
    f.write(string) 

अजगर 2 पर मैं file.write पसंद करते हैं क्योंकि >> वाक्य रचना मान्य नहीं है। पायथन 3 के लिए आप इसके बजाय प्रिंट फ़ंक्शन का उपयोग करना पसंद कर सकते हैं, जिसे आपको कुछ अतिरिक्त चीजें नोट करना चाहिए (उदाहरण के लिए स्वचालित रूप से संख्याओं को आपके लिए तारों में कनवर्ट करना आदि)।

+2

सच है लेकिन संबंधित नहीं है, आपको अभी भी 'प्रिंट >> एफ' के साथ एक संदर्भ प्रबंधक की आवश्यकता होगी – Kos

14

मैं यहां व्यक्त की गई कई राय के साथ कुछ हद तक असहमत हूं, print >> f अनावश्यक है और इसे f.write के पक्ष में टालना चाहिए।

print और file.write काफी अलग संचालन हैं। file.write बस एक फ़ाइल में एक स्ट्रिंग लिखता है। print "टेक्स्ट के रूप में stdout करने के लिए मान प्रस्तुत करें" की तरह है। स्वाभाविक रूप से, पाठ के रूप में एक स्ट्रिंग को प्रस्तुत करने का परिणाम केवल स्ट्रिंग है, इसलिए print >> f, my_string और f.write(my_string)लगभग अदला-बदले (एक नई लाइन के अतिरिक्त को छोड़कर) हैं। लेकिन file.write और print के बीच आपकी पसंद सामान्य रूप से आप जो कर रहे हैं उसके आधार पर होनी चाहिए; क्या आप एक फाइल को एक स्ट्रिंग लिख रहे हैं, या आप एक फाइल में मूल्य प्रस्तुत कर रहे हैं?

निश्चित रूप से print सख्ती से आवश्यक नहीं है, जिसमें आप इसे file.write के साथ कार्यान्वित कर सकते हैं। लेकिन फिर file.write कड़ाई से जरूरी नहीं है, क्योंकि आप फाइल डिस्क्रिप्टर से निपटने के लिए इसे os में संचालन के साथ कार्यान्वित कर सकते हैं। वास्तव में वे विभिन्न स्तरों पर संचालन कर रहे हैं, और आपको अपने उपयोग के लिए जो भी अधिक उपयुक्त है उसका उपयोग करना चाहिए (आमतौर पर स्तर के पास के पास के दूसरे स्तर पर काम कर रहा है, या उच्चतम स्तर जो आपके रास्ते में नहीं मिलता है)।

मुझे लगता है कि print >> f वाक्यविन्यास काफी भयानक है, और यह वास्तव में एक अच्छा उदाहरण है कि क्यों print एक समारोह होना चाहिए था। यह पायथन 3 में काफी सुधार हुआ है। लेकिन यदि आप पाइथन 2 कोड लिख रहे हैं, तो आप print >> f, thing1, thing2, thing3, ... से print(thing1, thing2, thing3, file=f) को कनवर्ट करने के लिए आसान है, जहां से आप रोल रोल करते हैं print के प्रतिपादन के बराबर करने के लिए अपना स्वयं का कोड और फिर f.write(text) पर कॉल करें। मुझे पूरा यकीन है कि पाइथन 2 से पायथन 3 तक सेमी-स्वचालित कनवर्टर भी आपके लिए रूपांतरण करेगा, अगर आप print >> f फॉर्म से बचें तो यह संभवतः नहीं कर सका।

नीचे पंक्ति: stdout (या फ़ाइल में) मानों को प्रस्तुत करने के लिए print का उपयोग करें। फ़ाइल में टेक्स्ट लिखने के लिए f.write का उपयोग करें।

2

@agf

मैं अपने लचीलेपन के कारण print(..., file=f) वरीय साथ सहमत हूँ।

with open('test.txt', 'w') as f: 
    print('str', file=f) 
    print(1, 20, file=f) 

मौजूदा print कमांड को परिवर्तित करना भी आसान है।

write केवल स्ट्रिंग स्वीकार करता है।

3

आपको उन चीजों में से कोई भी नहीं करना चाहिए।

f = open(file, 'w') 
print(string, file=f) 
बेशक

इस अजगर 3. लेकिन अगर सिर्फ उपयोग करने के लिए है करने के लिए आदर्श तरीका है: करने के लिए सबसे pythonic बात अजगर 3 प्रिंट समारोह का उपयोग करें (के रूप में अजगर 2 प्रिंट करने का विरोध किया बयान) है आप अजगर 2 का उपयोग कर अटक कर रहे हैं आप फ़ाइल के शीर्ष पर एक future statement का उपयोग करने पर इसे बंद कर सकते हैं:

from __future__ import print_function 

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

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