আমার কাছে একটি মাল্টি-লাইনের স্ট্রিং রয়েছে যা আমি প্রতিটি লাইনে অপারেশন করতে চাই, যেমন:
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()
বিপরীতভাবে সঠিকভাবে newlines পরিচালনা করে les split("\n")
।
True
যুক্তি দিয়ে ডেকে এলে বিভক্ত ফলাফলের ক্ষেত্রে নিউলাইন চরিত্রটি efচ্ছিকভাবে @ স্পটিনিস দ্বারা উল্লিখিত সুবিধাটিও রয়েছে ।
কেন আপনি ব্যবহার করবেন না সে সম্পর্কে বিস্তারিত ব্যাখ্যা split("\n")
:
\n
পাইথনে, আপনি যে প্ল্যাটফর্মটি চালনা করেন সেগুলি থেকে স্বাধীনভাবে একটি ইউনিক্স লাইন-ব্রেক (ASCII দশমিক কোড 10) উপস্থাপন করে। যাইহোক, LINEBREAK উপস্থাপনা প্ল্যাটফর্ম-নির্ভরশীল । উইন্ডোজে \n
দুটি অক্ষর CR
এবং LF
(এএসসিআইআই দশমিক কোড ১৩ এবং ১০, এ কেএ \r
এবং \n
) রয়েছে, কোনও আধুনিক ইউনিক্সে (ওএস এক্স সহ) এটি একক অক্ষর 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
এটি
মূল পোস্টটি কোডের জন্য অনুরোধ করা হয়েছে যা কয়েকটি সারি মুদ্রণ করে (যদি তারা কিছু শর্তে সত্য হয়) এবং নীচের সারিটি প্রিন্ট করে। আমার বাস্তবায়ন এটি হবে:
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 এর উত্তর আরও ধাক্কা প্রয়োজন, এবং আমি তার উত্তর বৃদ্ধি করতে চাই। যাইহোক, তিনি আমাকে নীচের কৌশলটিতে নিয়ে গিয়েছিলেন; এটি যদি পাওয়া যায় তবে এটি স্ট্রিংআইও ব্যবহার করবে (তবে দ্রষ্টব্য: সিস্ট্রিংআইও এবং স্ট্রিংআইও এক নয় , কারণ আপনি সিস্ট্রিং আইও সাবক্লাস করতে পারবেন না ... এটি একটি অন্তর্নির্মিত ... তবে বেসিক ক্রিয়াকলাপের জন্য সিনট্যাক্সটি অভিন্ন হবে, তাই আপনি এটি করতে পারেন ):
try:
import cStringIO
StringIO = cStringIO
except ImportError:
import StringIO
for line in StringIO.StringIO(variable_with_multiline_string):
pass
print line.strip()