पायथन - लेखन () बनाम लेखन () और संक्षिप्त स्ट्रिंग


124

इसलिए मैं पायथन सीख रहा हूं। मैं पाठों के माध्यम से जा रहा हूं और एक समस्या में भाग गया हूं, जहां मुझे प्रत्येक उपयोगकर्ता इनपुट चर (वस्तु ) के बीच होने के दौरान target.write()एक एकल में एक महान संक्षेपण करना पड़ा ।write()"\n"write()

मेरे द्वारा लाया गया:

nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)

अगर मैं करने की कोशिश करता हूं:

textdoc.write(lines)

मुझे एक त्रुटि मिलती है। लेकिन अगर मैं टाइप करता हूं:

textdoc.write(line1 + "\n" + line2 + ....)

तब यह ठीक काम करता है। मैं किसी नई पंक्ति के लिए स्ट्रिंग का उपयोग करने में असमर्थ क्यों हूं, write()लेकिन मैं इसका उपयोग कर सकता हूं writelines()?

पाइथन 2.7 जब मैंने गूगल पर खोजा सबसे अधिक संसाधन जो मुझे मिले थे वे मेरे सिर के ऊपर थे, मैं अभी भी एक व्यक्ति हूं।


linesआपके उदाहरण में एक तार नहीं है। यह छः तारों से युक्त एक टपल है।
बछसौ

जवाबों:


147
  • writelines तार की एक चलने योग्य उम्मीद करता है
  • write एक ही तार की उम्मीद है।

line1 + "\n" + line2उन स्ट्रिंग्स को एक साथ एक स्ट्रिंग में विलय कर देता है, इसे पास करने से पहले write

ध्यान दें कि यदि आपके पास कई लाइनें हैं, तो आप उपयोग करना चाह सकते हैं "\n".join(list_of_lines)


50
अधिक विशेष रूप से, writelinesएक पुनरावृत्ति की उम्मीद है। आप एक सूची, एक ट्यूपल या एक जनरेटर का उपयोग कर सकते हैं।
मार्क रैनसम

उत्तर के लिए धन्यवाद सर। मैं नाम (list_of_lines) के द्वारा मान रहा हूं कि मुझे तार की सूची बनानी चाहिए और फिर .join (सूची) में भेजना चाहिए?
AbeLinkon

9
यदि आपके पास कई लाइनें हैं write, writelinesतो आपको इसके बजाय क्यों उपयोग करना चाहिए ? राइटलाइन बेहतर प्रदर्शन कर सकती है क्योंकि इसमें एक अस्थायी कॉन्टेनेटेड स्ट्रिंग बनाने की जरूरत नहीं है, बस लाइनों पर पुनरावृति होती है।
बुके

@ hBy2Py: इसके ठीक विपरीत: stackoverflow.com/a/6165711/281545
Mr_and_Mrs_D

1
एक एकल स्ट्रिंग भी पायथन में एक
चलने योग्य है

123

मैं लिखित रूप में एक नई लाइन के लिए स्ट्रिंग का उपयोग करने में असमर्थ क्यों हूं () लेकिन मैं इसे राइटलाइन () में उपयोग कर सकता हूं?

यह विचार निम्नलिखित है: यदि आप एक स्ट्रिंग लिखना चाहते हैं, तो आप ऐसा कर सकते हैं 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)

यह इनपुट फ़ाइल लाइन लाइन द्वारा पढ़ता है। जैसे ही एक लाइन पढ़ी जाती है, यह लाइन आउटपुट फाइल पर लिखी जाती है। योजनाबद्ध रूप से बोली जाने वाली, मेमोरी में हमेशा केवल एक ही लाइन होती है (रीडलाइन / राइटलाइन अप्रोच के मामले में पूरी फाइल कंटेंट की तुलना में मेमोरी में होती है)।


5
@AbeLinkon: मैं इस निष्कर्ष का समर्थन नहीं करूंगा। write()और writelines()मूल रूप से समकक्ष हैं और उनका उपयोग भी व्यक्तिगत स्वाद का सवाल है। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि स्ट्रिंग्स (कहा जाता है lines) की एक लंबी लंबी सूची के लिए यह लिखने की f.write('\n'.join(lines))तुलना में कम कुशल है for l in line: f.write('%s\n' % l)। पहले मामले में, इसे लिखने से पहले एक पूरी तरह से नया और बहुत लंबा स्ट्रिंग स्मृति में बनाया गया है। दूसरे मामले में डेटा को टुकड़ा-वार लिखा जाता है।
डॉ। जन-फिलिप गेर्के

3
f.write ('\ n'.join (लाइन्स)) ने अंतिम एनक्यु नहीं जोड़ा जब मैंने इसे चलाया था।
Jiminion

5
बेशक आप ऐसा नहीं करेंगे outf.writelines(inf.readlines())बल्कि outf.writelines(inf)। जिस फ़ंक्शन का हम उपयोग नहीं करना चाहते हैं वह readlines()नहीं है writelines()
मूइओपीप

2
@mooeeeeeep: जबकि कुछ भी कार्यक्षमता / कार्यान्वयन के साथ गलत नहीं है writelines(), इसके शब्दार्थ हैं, जैसा कि समझाया गया है, आदर्श से कम। यही कारण है कि मैंने कभी इसका इस्तेमाल नहीं किया। और मैंने इसे कभी याद नहीं किया।
डॉ। जन-फिलिप गेर्के

2
@AbeLinkon - शायद आपको इस उत्तर को स्वीकार करने पर विचार करना चाहिए, यह स्पष्ट रूप से आपके द्वारा स्वीकार किए जाने की तुलना में बेहतर है
पीटर एम - का मतलब मोनिका

-4

यदि आप किसी सूची को अचार को सहेजना और लोड करना चाहते हैं

अचार की बचत:

with open("yourFile","wb")as file:
 pickle.dump(YourList,file)

और लोड हो रहा है:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)

-5

वास्तव में, मुझे लगता है कि समस्या यह है कि आपकी चर "रेखाएं" खराब हैं। आपने लाइनों को टुप के रूप में परिभाषित किया है, लेकिन मेरा मानना ​​है कि लेखन () को एक स्ट्रिंग की आवश्यकता होती है। आपको बस अपने कॉमा को प्लसस (+) में बदलना है।

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

कार्य करना चाहिए।


-5

16 जेड जेड की किताब से व्यायाम करें? आप निम्न वर्णों का उपयोग कर सकते हैं:

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()

बहुत कमजोर समाधान। यदि आप इस तरीके से कई लाइनों को बदलना चाहते हैं, तो आपको इसे इस तरह करना चाहिए " \n ".join((line1, line2, line3)):।
बछसौ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.