পাইথন - লিখুন () বনাম শিরোনাম () এবং সংক্ষিপ্ত স্ট্রিং


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()?

পাইথন ২.7 যখন আমি গুগল সর্বাধিক সংস্থান খুঁজে পেয়েছি যেগুলি আমার মাথার উপরে ছিল, তখনও আমি একজন সাধারণ লোক।


linesআপনার উদাহরণের একটি স্ট্রিং নয়। এটি ছয়টি স্ট্রিং সমন্বিত একটি টুপল।
বাছসৌ

উত্তর:


147
  • writelines একটি পুনরাবৃত্ত স্ট্রিং আশা করে
  • write একটি একক স্ট্রিং আশা করে

line1 + "\n" + line2এই স্ট্রিংগুলিকে পাস করার আগে একক স্ট্রিংয়ের সাথে একত্রী করে write

মনে রাখবেন যে আপনার যদি অনেকগুলি লাইন থাকে তবে আপনি ব্যবহার করতে পারেন "\n".join(list_of_lines)


50
আরও সুনির্দিষ্টভাবে, writelinesপুনরাবৃত্তির প্রত্যাশা করে। আপনি একটি তালিকা, একটি টিপল বা জেনারেটর ব্যবহার করতে পারেন।
মার্ক মুক্তি পেতে

স্যার উত্তরের জন্য আপনাকে ধন্যবাদ। আমি নাম ধরে নিচ্ছি (list_of_lines) যে আমার স্ট্রিংয়ের একটি তালিকা তৈরি করা উচিত এবং তারপরে .join (তালিকা) এ পাস করা উচিত?
অ্যাবেলিংকন

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)

প্রতিটি স্ট্রিংকে তার নিজের লাইনে রাখার সময় পাইথনে একটি স্ট্রিংয়ের তালিকা লেখার জন্য পাইথনের একটি মূmatic় উপায়টি যা নিম্নলিখিত:

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.write('\n'.join(lines))

এটি আপনার জন্য ফাইলটি বন্ধ করার যত্ন নেয়। কনস্ট্রাক্ট '\n'.join(lines)যোগসূত্র (সংযোগ স্থাপন করে) তালিকায় স্ট্রিং linesএবং চরিত্র ব্যবহার '\ এন' আঠা হিসাবে। এটি +অপারেটর ব্যবহারের চেয়ে বেশি দক্ষ ।

একই linesক্রম থেকে শুরু করে একই আউটপুট দিয়ে শেষ, তবে ব্যবহারwritelines() :

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.writelines("%s\n" % l for l in lines)

এটি একটি জেনারেটর এক্সপ্রেশন ব্যবহার করে এবং ডায়নামিকভাবে নতুন লাইন-সমাপ্ত স্ট্রিংগুলি তৈরি করে। writelines()স্ট্রিংগুলির এই ক্রমটি পুনরাবৃত্তি করে এবং প্রতিটি আইটেম লেখেন।

সম্পাদনা করুন: অন্য একটি বিষয় সম্পর্কে আপনার সচেতন হওয়া উচিত:

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
@ অ্যাবেলিংকন: আমি এই উপসংহারটিকে সমর্থন করব না। write()এবং writelines()মূলত সমতুল্য এবং তাদের ব্যবহারও ব্যক্তিগত স্বাদের প্রশ্ন। যাইহোক, এটি লক্ষণীয় যে স্ট্রিংগুলির একটি দীর্ঘ দীর্ঘ তালিকার জন্য (বলা হয় lines) এটি লেখার f.write('\n'.join(lines))চেয়ে কম দক্ষ for l in line: f.write('%s\n' % l)। প্রথম ক্ষেত্রে, সম্পূর্ণ নতুন এবং খুব দীর্ঘ স্ট্রিংটি লেখার আগে স্মৃতিতে তৈরি করা হয়। দ্বিতীয় ক্ষেত্রে ডেটা টুকরা অনুসারে লেখা হয়।
ডাঃ জানু-ফিলিপ গেহর্ক্ক

3
f.writ ('\ n'.join (লাইন)) আমি চালানোর সময় শেষ এনএল যোগ করিনি।
জিমিনিয়ন

5
অবশ্যই আপনি না outf.writelines(inf.readlines())বরং না outf.writelines(inf)। আমরা আর যে ফাংশনটি ব্যবহার করতে চাই না তা readlines()নয় writelines()
moooeeeep

2
@ মূইউইপি: যদিও এর কার্যকারিতা / বাস্তবায়নে কোনও ভুল নেই writelines(), তবে এর শব্দার্থবিজ্ঞান যেমন ব্যাখ্যা করা হয়েছে, আদর্শের চেয়ে কম। এ কারণেই আমি কখনই এটি ব্যবহার করি নি। এবং আমি এটি কখনও মিস করি না।
ডাঃ জানু-ফিলিপ গেহর্ক্ক

2
@ অ্যাবেলিংকন - সম্ভবত আপনি এই উত্তরটি গ্রহণ করার জন্য বিবেচনা করা উচিত, আপনি যেটি প্রাথমিকভাবে গ্রহণ করেছেন তার চেয়ে পরিষ্কারভাবে এটি ভাল
পিটার এম - মনিকা 20

-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))
বাচসৌ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.