मेरे पास एक बहु-पंक्ति स्ट्रिंग शाब्दिक है जिसे मैं प्रत्येक पंक्ति पर एक ऑपरेशन करना चाहता हूं, जैसे:
inputString = """Line 1
Line 2
Line 3"""
मैं निम्नलिखित की तरह कुछ करना चाहता हूँ:
for line in inputString:
doStuff()
मेरे पास एक बहु-पंक्ति स्ट्रिंग शाब्दिक है जिसे मैं प्रत्येक पंक्ति पर एक ऑपरेशन करना चाहता हूं, जैसे:
inputString = """Line 1
Line 2
Line 3"""
मैं निम्नलिखित की तरह कुछ करना चाहता हूँ:
for line in inputString:
doStuff()
जवाबों:
inputString.splitlines()
आपको प्रत्येक आइटम के साथ एक सूची देगा, splitlines()
विधि को प्रत्येक लाइन को एक सूची तत्व में विभाजित करने के लिए डिज़ाइन किया गया है।
''.splitlines() == []
, ['']
साथ नहीं ''.split('\n')
।
दूसरों ने कहा:
inputString.split('\n') # --> ['Line 1', 'Line 2', 'Line 3']
यह उपरोक्त के समान है, लेकिन स्ट्रिंग मॉड्यूल के कार्यों को हटा दिया गया है और इसे टाला जाना चाहिए:
import string
string.split(inputString, '\n') # --> ['Line 1', 'Line 2', 'Line 3']
वैकल्पिक रूप से, यदि आप ब्रेक अनुक्रम (सीआर, एलएफ, सीआरएलएफ) को शामिल करने के लिए प्रत्येक पंक्ति चाहते हैं, तो splitlines
एक True
तर्क के साथ विधि का उपयोग करें :
inputString.splitlines(True) # --> ['Line 1\n', 'Line 2\n', 'Line 3']
inputString.split(os.linesep)
प्लेटफ़ॉर्म विशिष्ट लाइन टर्मिनेटर का उपयोग करेगा।
का उपयोग करेंstr.splitlines()
।
splitlines()
इसके विपरीत, ठीक से नए सिरे से संभालता है split("\n")
।
इसमें वैकल्पिक रूप से @efotinis द्वारा उल्लिखित लाभ भी शामिल है, जब True
तर्क के साथ विभाजित परिणाम में न्यूलाइन वर्ण शामिल होता है।
आप का उपयोग क्यों नहीं करना चाहिए पर विस्तृत विवरण split("\n")
:
\n
पायथन में, उस मंच से स्वतंत्र रूप से एक यूनिक्स लाइन-ब्रेक (ASCII दशमलव कोड 10) का प्रतिनिधित्व करता है, जहां आप इसे चलाते हैं। हालाँकि, लाइनब्रेक प्रतिनिधित्व प्लेटफ़ॉर्म-निर्भर है । विंडोज पर, \n
दो वर्ण हैं, CR
और LF
(ASCII दशमलव कोड 13 और 10, AKA ) \r
और \n
किसी भी आधुनिक यूनिक्स (OS X सहित) पर, यह एकल वर्ण है LF
।
print
, उदाहरण के लिए, सही ढंग से काम करता है, भले ही आपके पास लाइन एंडिंग के साथ एक स्ट्रिंग हो जो आपके प्लेटफॉर्म से मेल न खाती हो:
>>> print " a \n b \r\n c "
a
b
c
हालांकि, स्पष्ट रूप से "\ n" पर विभाजित होने से, प्लेटफ़ॉर्म-निर्भर व्यवहार प्राप्त होगा:
>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']
यहां तक कि अगर आप उपयोग करते हैं os.linesep
, तो यह केवल आपके प्लेटफ़ॉर्म पर नएलाइन विभाजक के अनुसार विभाजित होगा, और विफल हो जाएगा यदि आप अन्य प्लेटफार्मों में बनाए गए पाठ को संसाधित कर रहे हैं, या नंगे के साथ \n
:
>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']
splitlines
इन सभी समस्याओं का हल:
>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']
पाठ मोड में फाइलें पढ़ना आंशिक रूप से न्यूलाइन प्रतिनिधित्व समस्या को कम करता है, क्योंकि यह पायथन \n
को प्लेटफॉर्म की न्यूलाइन प्रतिनिधित्व में परिवर्तित करता है। हालाँकि, टेक्स्ट मोड केवल विंडोज पर मौजूद है। यूनिक्स प्रणालियों पर, सभी फाइलें बाइनरी मोड में खोली जाती हैं, इसलिए split('\n')
एक यूनिक्स सिस्टम में विंडोज फाइल के साथ उपयोग करने से अवांछित व्यवहार हो जाएगा। इसके अलावा, अन्य स्रोतों, जैसे सॉकेट से संभावित रूप से अलग-अलग नईलाइनों के साथ तार को संसाधित करना असामान्य नहीं है।
splitlines
पर विभाजित हो जाएगा । यूनिक्स में एक विंडोज़ फ़ाइल पढ़ते समय असफल हो जाएगा, उदाहरण के लिएsplit(os.linesep)
इस विशेष मामले में ओवरकिल हो सकता है लेकिन StringIO
फ़ाइल जैसी वस्तु बनाने के लिए एक अन्य विकल्प का उपयोग करना शामिल है
for line in StringIO.StringIO(inputString):
doStuff()
str.split
, तो किसी भी मेमोरी को आवंटित करने की आवश्यकता नहीं होती है (यह स्ट्रिंग को इन-प्लेस पढ़ता है)। एक नुकसान यह है कि यह बहुत धीमी है अगर आपStringIO
(लगभग 50x) का उपयोग करते हैं । यदि आप उपयोग करते हैं cStringIO
, हालांकि, यह 2x के बारे में तेज है
मूल पोस्ट कोड के लिए अनुरोध किया गया है जो कुछ पंक्तियों को प्रिंट करता है (यदि वे कुछ शर्त के लिए सही हैं) प्लस निम्न पंक्ति। मेरा कार्यान्वयन यह होगा:
text = """1 sfasdf
asdfasdf
2 sfasdf
asdfgadfg
1 asfasdf
sdfasdgf
"""
text = text.splitlines()
rows_to_print = {}
for line in range(len(text)):
if text[line][0] == '1':
rows_to_print = rows_to_print | {line, line + 1}
rows_to_print = sorted(list(rows_to_print))
for i in rows_to_print:
print(text[i])
मैं चाहता हूं कि टिप्पणियों में उचित कोड टेक्स्ट फ़ॉर्मेटिंग हो, क्योंकि मुझे लगता है कि @ 1_CR के उत्तर को अधिक धक्कों की आवश्यकता है, और मैं उनके उत्तर को बढ़ाना चाहूंगा। वैसे भी, उन्होंने मुझे निम्नलिखित तकनीक तक पहुंचाया; यह उपलब्ध होने पर cStringIO का उपयोग करेगा (लेकिन ध्यान दें: cStringIO और StringIO समान नहीं हैं , क्योंकि आप cStringIO को उप-वर्ग नहीं कर सकते हैं ... यह एक अंतर्निहित है ... लेकिन बुनियादी संचालन के लिए वाक्यविन्यास समान होगा, इसलिए आप ऐसा कर सकते हैं। ):
try:
import cStringIO
StringIO = cStringIO
except ImportError:
import StringIO
for line in StringIO.StringIO(variable_with_multiline_string):
pass
print line.strip()