2010-12-30 7 views
33

में 'w' मोड में फ़ाइल खोलते हैं तो मैं क्यों छोटा हो जाता हूं, मैं ज़ेड शॉ की पायथन बुक के माध्यम से जा रहा हूं। मैं वर्तमान में फाइल अध्याय खोलने और पढ़ने पर काम कर रहा हूं। मैं सोच रहा हूं कि हमें एक छंटनी करने की ज़रूरत क्यों है, जब हम पहले से ही 'डब्ल्यू' मोड में फाइल खोल रहे हैं?जब हम पाइथन

print "Opening the file..." 
target = open(filename, 'w') 

print "Truncating the file. Goodbye!" 
target.truncate() 
+15

यह दिखाने के लिए कि यह किया जा सकता है। –

+1

यह विधि केवल-पढ़ने योग्य मोड में काम नहीं करती है। –

उत्तर

33

जैसा कि आपने देखा है, लिखने के तरीके में खोलने से फ़ाइल को ओवरराइट कर दिया जाएगा, यह अनावश्यक है। पाइथन दस्तावेज के Input and Output अनुभाग पर अधिक जानकारी।

1

यह मानक पॉज़िक्स अर्थशास्त्र का सिर्फ एक प्रतिबिंब है। आदमी फॉपेन देखें (3)। पाइथन बस उसे लपेटता है।

+3

'फॉपेन (3)' का उल्लेख है कि इसे स्वचालित रूप से छोटा कर दिया जाता है ताकि अतिरिक्त 'ट्रंकेट() 'आवश्यक न हो। – ismail

+1

आप सही हैं। शायद उसने गलती की? – Keith

+0

या इग्नासिओ ने इंगित किया है, यह सिर्फ यह दिखाया जा सकता है कि एक छोटा सा() विधि है और यह कैसे काम करता है। – Animesh

27

तो ज़ेड शॉ एक फ़ाइल पर truncate() को पहले से छोटा कर दिया गया है। ठीक है, यह सुंदर व्यर्थ है। उसने ऐसा क्यों किया? कौन जाने!? उससे पूछो!

शायद वह यह दिखाने के लिए करता है कि विधि मौजूद है? हो सकता है, लेकिन यह बहुत मुश्किल होगा, क्योंकि मुझे प्रोग्रामर के रूप में अपने 15 वर्षों में एक फ़ाइल को छीनने की आवश्यकता नहीं है, इसलिए इसकी एक नौसिखिया किताब में कोई जगह नहीं है।

शायद वह ऐसा करता है क्योंकि वह सोचता है कि उसे फ़ाइल को छोटा करना है, और वह बस इतना नहीं जानता कि यह व्यर्थ है?

शायद वह जानबूझकर नए लोगों को भ्रमित करने के लिए करता है? वह अपने सामान्य मोडस ऑपरंदी के साथ फिट होगा, जो जानबूझकर लोगों को बिना किसी कारण के बंद कर देता है।

अद्यतन: वह ऐसा कारण अब स्पष्ट है। बाद के संस्करणों में उन्होंने इस प्रश्न को अध्याय में "सामान्य प्रश्न" के रूप में सूचीबद्ध किया है, और आपको दस्तावेज़ों को पढ़ने के लिए कहता है। इसलिए यह है:

  1. दस्तावेज़ों को पढ़ने के लिए आपको सिखाएं।
  2. कोड के हर भाग को समझें जिसे आप प्रतिलिपि बनाने से पहले कहीं से पेस्ट कॉपी करते हैं।

यदि आप अच्छी शिक्षा शैली है या नहीं, तो आप बहस कर सकते हैं, मुझे नहीं पता।

"सहायता मैं ज़ेड शॉज़ पुस्तक को समझ नहीं पा रहा हूं" - एसओ पर पूछताछ घट गई थी, इसलिए मैं यह नहीं कह सकता कि यह किसी भी अन्य पुस्तक की तुलना में कहीं भी बदतर है, जिसका अर्थ है कि यह कई लोगों से बेहतर है। :-)

+11

+1;) – ismail

+0

@Lennart Regebro Django के साथ शुरू करना उपयोगकर्ताओं को इस पुस्तक में संदर्भित करता है, Django के दो स्कूप्स LPTHW का उपयोग करने के लिए संदर्भित करते हैं। बड़े पैमाने पर मेरा मानना ​​है क्योंकि यह किताब करके सीखना है, न केवल सैद्धांतिक। मैं इस + कोडेकैडमी का उपयोग कर रहा हूं क्योंकि मुझे सीखने की ज़रूरत है।तो यदि आप उनके दृष्टिकोण की आलोचना करते हैं तो आप किससे सुझाव देते हैं? – sayth

+2

@ सैथ: मैं उनके सामान्य दृष्टिकोण से सहमत हूं, लेकिन इससे बहुत सारे प्रश्न हुए। वे कम हो गए हैं, शायद उन्होंने मुद्दों को ठीक कर दिया है। उदाहरण के लिए, इस प्रश्न को अब इस अध्याय में "सामान्य प्रश्न" के रूप में सूचीबद्ध किया गया है, जहां ज़ेड आपको दस्तावेज़ों को जाने और पढ़ने और आपको अपने लिए समझने के लिए कहता है। तो शायद यह अब एक अच्छी किताब है। –

15

आप इसे मांगने से पहले सवाल पढ़ें चाहते हैं, तो वह यह आप के लिए जवाब देता है:

अतिरिक्त क्रेडिट: "आपको लगता है आप इस बात को समझ नहीं है, तो वापस के माध्यम से और उपयोग जाना टिप्पणी चाल यह आपके मन में दूर चुकता पाने के लिए। व्यक्ति को प्रत्येक रेखा से ऊपर सरल अंग्रेजी टिप्पणी, आप समझ में मदद मिलेगी या कम से कम आप जानते हैं कि आप क्या और अधिक अनुसंधान करने के लिए की आवश्यकता है।

एक स्क्रिप्ट पिछले के समान लिखें व्यायाम जो read और 01 का उपयोग करता हैसे आपके द्वारा अभी बनाई गई फ़ाइल को पढ़ें।

इस फ़ाइल में बहुत अधिक दोहराव है। तारों, प्रारूपों, और का उपयोग line1, line2, और line3 प्रिंट करने के लिए बच निकलता है, केवल 6 0 के बजाय केवल एक target.write() कमांड के साथ।

पता लगाएं कि हमें 'w' को खोलने के लिए अतिरिक्त पैरामीटर के रूप में क्यों पास करना पड़ा। संकेत: खुले आपको स्पष्ट रूप से कहने के लिए सुरक्षित रहने की कोशिश करता है कि आप फ़ाइल लिखना चाहते हैं।

यदि आप 'w' मोड के साथ फ़ाइल खोलते हैं, तो क्या आपको वास्तव में target.truncate() की आवश्यकता है?

जाओ अजगर की खुली समारोह के लिये दस्तावेज पढ़ सकते हैं और देखते हैं कि अगर सच है। "-। जेड शॉ

उन्होंने स्पष्ट रूप से खुद के लिए इन बातों को पता लगाने के लिए आप चाहता है, यह क्यों उसके अतिरिक्त क्रेडिट है महत्वपूर्ण है।

उन्होंने यह भी स्पष्ट रूप से कहा है कि वह आप विस्तार पर ध्यान देना। हर छोटी बात मायने रखती है चाहता है।

+6

यह सब ठीक है और अच्छा है, लेकिन यह हमेशा एक उपयोगी शिक्षण शैली नहीं है। मैं इतना अधिक चाहता हूं कि शुरुआत से सही दृष्टिकोण सिखाया जाए, * क्यों * यह बेकार सामान के साथ शुरू करने के बजाय सही है, और फिर पाठक को शायद एक असाधारण अतिरिक्त क्रेडिट प्रश्न की तरह दिखने की उम्मीद है जो छुपाता है जानकारी का एक वास्तविक उपयोगी गूंज। –

+0

आईएमएचओ यह ओपी प्रश्न – quasoft

+0

का सही जवाब है, वास्तव में, @ प्लैटिनमएज़ूर, अगर पाठक स्किम करने जा रहा है और विवरण नहीं पढ़ रहा है, तो वे'truncate() 'आउट के लिए एक व्यर्थ नो-ऑप कॉल सहित बेहतर हो सकते हैं। आदत का इस तरह वे जानते हैं कि फ़ाइलों को कैसे खोलें, ओपन (फ़ाइल नाम, 'आर +') के माध्यम से पढ़ें + लिखें। –

6
truncate() साथ

, तो आप फ़ाइल y का कितना घोषणा कर सकते हैं कहां हटाना चाहते हैं, इस पर आधारित है कि आप वर्तमान में फाइल में कहां हैं। पैरामीटर के बिना, truncate() डब्ल्यू की तरह कार्य करता है, जबकि डब्ल्यू हमेशा पूरी फ़ाइल को साफ करता है। इसलिए, इन दो विधियों समान रूप से कार्य कर सकते हैं, लेकिन वे जरूरी नहीं हैं।

+0

प्रश्न यह है कि उदाहरण में एक 'truncate() '(कोई तर्क के साथ) क्यों है। – EOL

7

हालांकि 'डब्ल्यू' मोड में खुलते समय इसे छोटा करने के लिए उपयोगी नहीं है, यह 'आर +' में उपयोगी है। हालांकि यह ओपी का सवाल नहीं है, मैं इसे यहां किसी भी व्यक्ति के लिए छोड़ने जा रहा हूं जो Google द्वारा यहां तक ​​कि नेतृत्व करता है जैसा मैंने किया था।

मान लीजिए कि आप खुले (मोड के साथ 'आर +', याद नहीं 'rw' मोड है) एक 5 पंक्ति इंडेंट json फ़ाइल और json.load एड वस्तु को संशोधित केवल 3 लाइनों होने के लिए करते हैं। यदि आप डेटा को वापस डेटा लिखने से पहले target.seek(0) पर हैं, तो आप पिछली कचरा के 2 लाइनों के साथ समाप्त हो जाएंगे। यदि आप target.truncate() यह नहीं करेंगे।

मुझे पता है कि यह स्पष्ट प्रतीत होता है, लेकिन मैं यहां हूं क्योंकि मैं उस ऑब्जेक्ट के बाद हुआ एक बग ठीक कर रहा हूं जो वर्षों के लिए समान आकार में रहा ... हस्ताक्षर एल्गोरिदम परिवर्तन के कारण घट गया। (यह स्पष्ट नहीं है कि इसे रोकने के लिए मुझे जो यूनिट परीक्षण जोड़ना था, वह भविष्य है। मैंने अपने सबसे लंबे समय तक डॉकस्ट्रिंग को कभी समझाया है कि मैं 2 हास्यास्पद रूप से प्रदूषित एल्गोरिदम के साथ हस्ताक्षर करने का परीक्षण क्यों कर रहा हूं।)

आशा है कि इससे किसी की मदद मिलेगी।

+1

धन्यवाद। यह जवाब, भले ही यह वास्तव में पूछे गए प्रश्न का उत्तर नहीं दे रहा है, मेरे उपयोग के मामले में बिल्कुल फिट बैठें – BrDaHa

0

जब आप लिखने के तरीके में फ़ाइल खोलते हैं, तो आप मूल को हटा देते हैं (सबकुछ हटाए जाने से पहले वहां था)। फिर जो कुछ भी आप लिखते हैं उसे फ़ाइल में जोड़ा जाता है। समस्या यह है कि, लिखना शुरुआत से जानकारी जोड़ना चाहता है, और अंत में पॉइंटर छोड़ा जाने पर IOError उठाता है। इस प्रकार के लेखन के लिए आप एपेंड का उपयोग करना चाहते हैं (फ़ाइल को 'ए +' तर्क के साथ खोलें)।

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