मैं लिखित रूप में एक नई लाइन के लिए स्ट्रिंग का उपयोग करने में असमर्थ क्यों हूं () लेकिन मैं इसे राइटलाइन () में उपयोग कर सकता हूं?
यह विचार निम्नलिखित है: यदि आप एक स्ट्रिंग लिखना चाहते हैं, तो आप ऐसा कर सकते हैं write()
। यदि आपके पास तार का एक क्रम है, तो आप उन सभी का उपयोग करके लिख सकते हैं writelines()
।
write(arg)
एक स्ट्रिंग को तर्क के रूप में अपेक्षा करता है और इसे फ़ाइल में लिखता है। यदि आप स्ट्रिंग्स की सूची प्रदान करते हैं, तो यह एक अपवाद बढ़ाएगा (वैसे, हमें त्रुटियां दिखाएगा!)।
writelines(arg)
तर्क के रूप में एक पुनरावृत्ति की अपेक्षा करता है (एक पुनरावृत्त वस्तु सबसे सामान्य अर्थों में एक टपल, एक सूची, एक स्ट्रिंग, या एक पुनरावृत्ति हो सकती है)। इटरेटर में निहित प्रत्येक आइटम को एक स्ट्रिंग होने की उम्मीद है। तार का एक टापू वह है जो आपने प्रदान किया है, इसलिए चीजों ने काम किया।
स्ट्रिंग (एस) की प्रकृति दोनों कार्यों के लिए कोई फर्क नहीं पड़ता है, अर्थात वे बस फ़ाइल को लिखते हैं जो भी आप उन्हें प्रदान करते हैं। दिलचस्प बात writelines()
यह है कि इसमें नए अक्षर नहीं जोड़े गए हैं, इसलिए विधि का नाम वास्तव में काफी भ्रामक हो सकता है। यह वास्तव में एक काल्पनिक पद्धति की तरह व्यवहार करता है जिसे कहा जाता है write_all_of_these_strings(sequence)
।
पाइथन में एक मुहावरेदार तरीका क्या है कि प्रत्येक स्ट्रिंग को अपनी संख्या में रखते हुए एक फाइल में तार की एक सूची लिखें।
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
यह आपके लिए फ़ाइल को बंद करने का ध्यान रखता है। निर्माण '\n'.join(lines)
सूची में तारों को जोड़ता है (जोड़ता है) lines
और गोंद के रूप में वर्ण '\ n' का उपयोग करता है। यह +
ऑपरेटर का उपयोग करने की तुलना में अधिक कुशल है ।
उसी lines
क्रम से शुरू होकर , उसी आउटपुट के साथ समाप्त होता है, लेकिन उपयोग करते हुए writelines()
:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
यह एक जनरेटर अभिव्यक्ति का उपयोग करता है और गतिशील रूप से न्यूलाइन-टर्मिनेटेड स्ट्रिंग्स बनाता है। writelines()
तार के इस क्रम पर iterates और हर आइटम लिखता है।
संपादित करें: एक और बिंदु जिसके बारे में आपको पता होना चाहिए:
write()
और पेश किए जाने readlines()
से पहले अस्तित्व में writelines()
था। writelines()
बाद में एक प्रतिरूप के रूप में पेश किया गया था readlines()
, ताकि कोई आसानी से उस फ़ाइल सामग्री को लिख सके, जिसे अभी पढ़ा गया था readlines()
:
outfile.writelines(infile.readlines())
वास्तव में, यह मुख्य कारण है कि writelines
ऐसा भ्रमित नाम क्यों है। इसके अलावा, आज, हम वास्तव में इस पद्धति का उपयोग नहीं करना चाहते हैं। डेटा लिखने के लिए शुरू करने readlines()
से पहले अपनी मशीन की मेमोरी में पूरी फ़ाइल पढ़ता है writelines()
। सबसे पहले, यह समय बर्बाद कर सकता है। अन्य हिस्सों को पढ़ते समय डेटा के कुछ हिस्सों को लिखना क्यों शुरू नहीं करें? लेकिन, सबसे महत्वपूर्ण बात यह है कि यह दृष्टिकोण बहुत अधिक मेमोरी वाला हो सकता है। एक चरम परिदृश्य में, जहां इनपुट फ़ाइल आपकी मशीन की मेमोरी से बड़ी है, यह दृष्टिकोण भी काम नहीं करेगा। इस समस्या का समाधान केवल पुनरावृत्तियों का उपयोग करना है। एक कार्य उदाहरण:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
यह इनपुट फ़ाइल लाइन लाइन द्वारा पढ़ता है। जैसे ही एक लाइन पढ़ी जाती है, यह लाइन आउटपुट फाइल पर लिखी जाती है। योजनाबद्ध रूप से बोली जाने वाली, मेमोरी में हमेशा केवल एक ही लाइन होती है (रीडलाइन / राइटलाइन अप्रोच के मामले में पूरी फाइल कंटेंट की तुलना में मेमोरी में होती है)।
lines
आपके उदाहरण में एक तार नहीं है। यह छः तारों से युक्त एक टपल है।