আমি একাধিক লাইনে স্ট্রিমকে কীভাবে ভাগ করব?


287

আমার কাছে একটি মাল্টি-লাইনের স্ট্রিং রয়েছে যা আমি প্রতিটি লাইনে অপারেশন করতে চাই, যেমন:

inputString = """Line 1
Line 2
Line 3"""

আমি নীচের মতো কিছু করতে চাই:

for line in inputString:
    doStuff()

উত্তর:


437
inputString.splitlines()

প্রতিটি আইটেমের সাথে আপনাকে একটি তালিকা দেবে, splitlines()পদ্ধতিটি প্রতিটি লাইনকে তালিকার উপাদানগুলিতে বিভক্ত করার জন্য ডিজাইন করা হয়েছে।


12
+1 টি। আমি মনে করি এটি গৃহীত সমাধানের চেয়ে ভাল, কারণ এটি স্পষ্টভাবে লাইন বিভাজকের সাথে গণ্ডগোল করে না। এটি কেবলমাত্র একটি ডেডিকেটেড এপিআই পদ্ধতিতে কাজ করে!
lpapp

12
@ প্লাপ, আমি সম্পূর্ণ একমত স্প্লিটলাইনস () শব্দার্থগতভাবে (এবং কার্যকরীভাবে, যেহেতু এটি সর্বজনীন নিউলাইনগুলি ব্যবহার করে এবং একটি ফাঁকা ফাঁকা রেখা বাদ দেয়) বিভক্তির চেয়ে ভাল ('\ n')। তারপরে (২০০৮) আমি মাত্র একজন নবাগত পাইথনিস্তা এবং গ্রেপিং যদিও আমার স্ক্রিপ্টগুলি এখন দেখায় যে আমিও স্প্লিটলাইন () প্রায় একচেটিয়াভাবে ব্যবহার করছি। তাই আমি আমার 104-পয়েন্ট উত্তর ( * sob ... * ) মুছে ফেলছি এবং পরিবর্তে এটির দ্বারা সমর্থন করা হবে।
ইফোটিনিস

18
এটি যেমন করে ''.splitlines() == [], ['']তেমনি করেও ''.split('\n')
ডানফোন

198

অন্যরা যেমন বলেছেন:

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']

12
এটি কেবলমাত্র সেই সিস্টেমে কাজ করবে যা 'line n' লাইন টার্মিনেটর হিসাবে ব্যবহার করে।
জেরেমি ক্যান্ট্রেল

20
@ জেরেমি: ট্রিপল-কোটযুক্ত স্ট্রিং লিটারেলরা প্ল্যাটফর্ম নির্বিশেষে সর্বদা '\ n' ইওএল ব্যবহার করে। সুতরাং ফাইল পাঠ্য মোডে পড়া।
ইফোটিনিস

16
inputString.split(os.linesep)প্ল্যাটফর্ম নির্দিষ্ট লাইন টার্মিনেটর ব্যবহার করবে।
জেমস

10
আশ্চর্যের বিষয় যে এই উত্তরটি এতটা উজ্জীবিত। হার্ড কোডিং '\ n' একটি খারাপ ধারণা, তবে আপনি যদি এর পরিবর্তে os.linesep ব্যবহার করেন তবে লিনাক্স এবং তার বিপরীতে উইন্ডোজ লাইন শেষ হওয়া নিয়ে আপনার সমস্যা রয়েছে Moreover সম্ভবত এটির ব্যবহারের খুব কম সাধারণ উপায় ...
lpapp

4
একটি সাবপটিমাল পদ্ধতি, একটি অবচিত পদ্ধতি এবং সর্বোত্তম পদ্ধতির অপ্রয়োজনীয় প্রকরণের সংমিশ্রণ।
jwg

50

ব্যবহার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')উইন্ডোজ ফাইলের সাথে ইউএনআইএক্স সিস্টেমে ব্যবহার করা অনাকাঙ্ক্ষিত আচরণের দিকে পরিচালিত করে। এছাড়াও, অন্যান্য উত্স যেমন সকেট থেকে সম্ভাব্য বিভিন্ন নিউলাইন দিয়ে স্ট্রিংগুলি প্রক্রিয়া করা অস্বাভাবিক কিছু নয়।


তুলনাটি ন্যায্য নয় কারণ আপনি প্ল্যাটফর্ম নির্দিষ্ট কিছু এড়াতে স্প্লিট (os.linesep) ব্যবহার করতে পারেন।
lpapp

6
@lpapp নোট যা শেষের কোনও লাইনে splitlinesবিভক্ত হবে । ইউনিক্সে উইন্ডোজ ফাইলটি পড়ার সময় ব্যর্থ হবে, উদাহরণস্বরূপsplit(os.linesep)
গনক্যালপ্প ২

1
আমার ক্ষেত্রে স্প্লিটলাইন ব্যবহারের আর একটি কারণ, ধন্যবাদ। আমি একটি +1 দিয়েছি। আমি ব্যক্তিগতভাবে এমনকি আপনার উত্তরের মন্তব্যগুলিতে তথ্য অন্তর্ভুক্ত করব।
lpapp

20

এই বিশেষ ক্ষেত্রে ওভারকিল হতে পারে তবে অন্য একটি বিকল্পের StringIOমধ্যে একটি ফাইল-জাতীয় অবজেক্ট তৈরি করতে জড়িত

for line in StringIO.StringIO(inputString):
    doStuff()

হ্যাঁ, এটি হ'ল সর্বাধিক মূখ্যাত্মক, বেশিরভাগ পাইথন-আইসি পদ্ধতির।
প্যারাম্যাগনেটিক ক্রোস্যান্ট

4
এই পদ্ধতির সুবিধার জন্য যখন তুলনা করা হয় তখন কোনও মেমরি বরাদ্দ করার প্রয়োজনstr.split হয় না (এটি স্ট্রিংটি জায়গায় পড়ে থাকে)। একটি অসুবিধা হ'ল আপনি যদি ব্যবহার করেন তবেStringIO এটি প্রায় ধীরে ধীরে (প্রায় 50x)। তবে আপনি যদি cStringIOএটি
goncalopp

2x দ্রুত কি?
ইরিনা রাপোপার্ট

1
@ ইরিনারোপ্পোর্ট, সিস্ট্রিংআইও স্ট্রিংআইও
ইরুভার

1

মূল পোস্টটি কোডের জন্য অনুরোধ করা হয়েছে যা কয়েকটি সারি মুদ্রণ করে (যদি তারা কিছু শর্তে সত্য হয়) এবং নীচের সারিটি প্রিন্ট করে। আমার বাস্তবায়ন এটি হবে:

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])

0

আমি মন্তব্যগুলি যথাযথ কোড পাঠ্য ফর্ম্যাটিং করতে চান, কারণ আমি মনে করি @ 1_CR এর উত্তর আরও ধাক্কা প্রয়োজন, এবং আমি তার উত্তর বৃদ্ধি করতে চাই। যাইহোক, তিনি আমাকে নীচের কৌশলটিতে নিয়ে গিয়েছিলেন; এটি যদি পাওয়া যায় তবে এটি স্ট্রিংআইও ব্যবহার করবে (তবে দ্রষ্টব্য: সিস্ট্রিংআইও এবং স্ট্রিংআইও এক নয় , কারণ আপনি সিস্ট্রিং আইও সাবক্লাস করতে পারবেন না ... এটি একটি অন্তর্নির্মিত ... তবে বেসিক ক্রিয়াকলাপের জন্য সিনট্যাক্সটি অভিন্ন হবে, তাই আপনি এটি করতে পারেন ):

try:
    import cStringIO
    StringIO = cStringIO
except ImportError:
    import StringIO

for line in StringIO.StringIO(variable_with_multiline_string):
    pass
print line.strip()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.