ফাইল লিখতে লাইনের সঠিক উপায়?


1069

আমি করতে অভ্যস্ত print >>f, "hi there"

তবে, মনে হচ্ছে এটি print >>হ্রাস পেয়েছে। উপরের লাইনটি করার প্রস্তাবিত উপায় কী?

আপডেট : এর সাথে সমস্ত উত্তর সম্পর্কে "\n"... এটি কি সর্বজনীন বা ইউনিক্স-নির্দিষ্ট? IE, আমার কি "\r\n"উইন্ডোজে করা উচিত ?


11
"\ n" ইউনিক্স-নির্দিষ্ট নয়। ফাইলটি পাঠ্য মোডে খুললে (ডিফল্ট), এটি বর্তমান প্ল্যাটফর্মের জন্য শেষ হওয়া সঠিক লাইনে স্বয়ংক্রিয়ভাবে অনুবাদ করা হয়। "\ R \ n" লিখলে "\ r \ r \ n" তৈরি হত যা ভুল।
ডি কোয়েজি

এসকি কোডটি দেখতে কেবল প্রিন্ট অর্ডার (os.linesep) স্টেটমেন্ট যুক্ত করুন (বেশিরভাগ ইউনিক্স সিস্টেমে 10)
স্টিফান গ্রুয়েনওয়াল্ড

আপনি কেন মনে করেন এটি অবমূল্যায়ন করা হয়েছে?
---

উত্তর:


1151

এটি যেমন সহজ হতে হবে:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

ডকুমেন্টেশন থেকে:

os.linesepপাঠ্য মোডে খোলা ফাইলগুলি লেখার সময় লাইন টার্মিনেটর হিসাবে ব্যবহার করবেন না (ডিফল্ট); পরিবর্তে সমস্ত প্ল্যাটফর্মে একক '\ n' ব্যবহার করুন।

কিছু দরকারী পঠন:

  • withবিবৃতি
  • open()
    • 'এ' সংযোজন বা ব্যবহারের জন্য
    • 'ডাব্লু' কাটা কাটা দিয়ে লিখতে
  • os(বিশেষত os.linesep)

36
এই উদাহরণটি খোলা / ঘনিষ্ঠ উদাহরণের চেয়ে ভাল। withফাইল বন্ধ করার বিষয়টি মনে রাখার জন্য নিরাপদ উপায় Using
ইয়াল

18
আমাকে ফোন করতে হবে না the_file.close()?
হুসেন

19
না আপনি করবেন না: stackoverflow.com/questions/3012488/…
তাল জেরোমে

@ জনসইয়েব আপনি কেন বলছেন "ওস.লাইনস্প। ওএসে প্রচুর ভাল জিনিস আছে!", আপনি যখন পোস্টের আগে এটি ব্যবহারের বিরুদ্ধে প্রস্তাব দিয়েছিলেন? আমি এখানে একটি সম্পাদনা সন্দেহ করছি, এবং এটি ডাউন ভোটের কারণ হতে পারে।
ঘোড়া স্মিথ

1
@ ব্যবহারকারী3226167: এটি একটি আকর্ষণীয় বিষয়। তবে আপনি সরল পাঠ্য লেখার জন্য বাইনারি ফাইল খুলবেন কেন?
জনসিওয়েব

961

print()পাইথন ২.6+ এর পরে পাওয়া ফাংশনটি আপনার ব্যবহার করা উচিত

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

পাইথন 3 এর জন্য আপনার দরকার নেই import, কারণ print()ফাংশনটি ডিফল্ট।

বিকল্পটি ব্যবহার করা হবে:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

নিউলাইনগুলি সম্পর্কিত পাইথন ডকুমেন্টেশন থেকে উদ্ধৃতি দেওয়া :

আউটপুট-এ, যদি নতুন লাইন হয় না, '\n'রচিত যে কোনও অক্ষর সিস্টেম ডিফল্ট লাইন বিভাজকটিতে অনুবাদ করা হয় os.linesep। যদি নিউলাইন হয় তবে ''কোনও অনুবাদ হয় না। যদি নিউলাইনটি অন্য কোনও আইনগত মান '\n'হয় তবে লিখিত যে কোনও অক্ষর প্রদত্ত স্ট্রিংয়ে অনুবাদ করা হয়।


35
-1 "আপনি যদি নিশ্চিত হতে চান তবে \n" newline = "" এর পরিবর্তে স্ট্রিংয়ে os.linesep যুক্ত করুন অন্যথায় আপনি \r\r\nউইন্ডোজটিতে যাবেন । একেবারে os.linesep নিয়ে ফুট করার কোনও কারণ নেই।
জন মাচিন

7
@ সোরিন: রাইট মোড যুক্ত করার জন্য আপনার সম্পাদনা অবশ্যই উন্নতি। তবে আপনি অদ্ভুতভাবে os.linesep সম্পর্কে উদ্ভট থাকেন। আমার উত্তর দেখুন। যাইহোক, আপনি যে ডকুমেন্টেশনটি উদ্ধৃত করেছেন তা 3.x এর জন্য, তবে এই অংশটি টেক্সট মোডে 2.x এর জন্যও বৈধ: কোনও '\ n' অক্ষরগুলি সিস্টেম ডিফল্ট লাইন বিভাজক, OS.linesep * তে অনুবাদ হয় । .. উইন্ডোজ: os.linesep লেখার সমান \r\nযা \nলিস্ট যা ওস.লাইনসেপ অনুবাদ করা হয় \r\nতাই শেষ ফলাফল \r\r\n
জন মাচিন

7
@ জন আপনি ঠিক বলেছেন, আমি os.linesep বাগটি সংশোধন করেছি। ধন্যবাদ।
sorin

3
open('myfile','a')পরিবর্তে এটি যুক্ত করার জন্য open('myfile','w')?
নেডার্ক

6
@BradRuderman এর অংশ POSIX কি একটি "লাইন" একটি টেক্সট ফাইলে, অর্থাত্ একটি টেক্সট ফাইল প্রতিটি লাইন গঠন জন্য আদর্শ একটি newline, এমনকি গত লাইন দ্বারা সমাপ্ত করতে হবে।
হুইলার

116

পাইথন ডক্স এই ভাবে সুপারিশ:

with open('file_to_write', 'w') as f:
    f.write('file contents\n')

তাই আমি সাধারণত এটিই করি :)

ডকস.প্যাথন.আর.আর্গ থেকে বিবৃতি :

ফাইল অবজেক্টগুলির সাথে ডিল করার সময় 'উইথ' কীওয়ার্ডটি ব্যবহার করা ভাল অনুশীলন । এর সুবিধা রয়েছে যে স্যুট শেষ হওয়ার পরে ফাইলটি যথাযথভাবে বন্ধ হয়ে গেছে, এমনকি পথে পথে কোনও ব্যতিক্রম উত্থাপিত হলেও। এটি সমতুল্য চেষ্টা-অবশেষে ব্লকগুলি লেখার চেয়েও ছোট।


1
যখন আমাকে withলুপের অভ্যন্তরে বাসা বাঁধার দরকার হয় তখন আমি এইভাবে পছন্দ করি না । এটি আমার লুপটিতে এগিয়ে যাওয়ার সাথে সাথেই আমাকে ক্রমাগত ফাইলটি খুলতে এবং বন্ধ করতে বাধ্য করে। হয়তো আমি এখানে কিছু মিস করছি, বা এই সত্যিই দৃশ্যে এটি একটি অসুবিধা?
সিবস জুবিলিং

38
কিভাবে মধ্যে লুপিং সম্পর্কে?
j7nn7k

এফডিতে লাইনের জন্য @ j7nn7k:
মমস্টুচ

86

Os.linesep সম্পর্কিত:

এখানে উইন্ডোজে ঠিক একটি অচিহ্নিত পাইথন ২.7.১ ইন্টারপ্রেটার সেশনটি রয়েছে:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

উইন্ডোজে:

যেমনটি প্রত্যাশা করা হয়েছিল, os.linesep এর মতো একই ফলাফল দেয় না'\n' । এটি একই ফলাফলটি অর্জন করতে পারে এমন কোনও উপায় নেই। 'hi there' + os.linesepএর সমতুল্য 'hi there\r\n', যা সমান নয়'hi there\n'

এটি এই সহজ: ব্যবহার \nযা os.linesep এ স্বয়ংক্রিয়ভাবে অনুবাদ করা হবে। পাইথনটির প্রথম বন্দর থেকে উইন্ডোজ পর্যন্ত এটি এত সহজ।

উইন্ডোজবিহীন সিস্টেমে os.linesep ব্যবহার করার কোনও মানে নেই এবং এটি উইন্ডোজে ভুল ফলাফল দেয়।

Os.linesep ব্যবহার করবেন না!


দুর্দান্ত উদাহরণ - আপনি যদি আইপিথন ব্যবহারকারী হন তবে কৌতূহল? ফর্ম্যাট সেশনগুলির জন্য দুর্দান্ত ফাংশন
অ্যালভিন

আপনি আমাদের এখানে কী বলার চেষ্টা করছেন তা আমি পুরোপুরি নিশ্চিত নই। অপারেটিং সিস্টেম দ্বারা নির্ধারিত হিসাবে os.linesep লাইন টার্ম অক্ষর (বা স্ট্রিং) প্রদান করবে। উইন্ডোজ ডিফল্টরূপে লাইন শেষের জন্য \ r \ n ব্যবহার করে। তবে, একটি একক \ n স্বীকৃত। \ N ব্যবহার করা সম্পূর্ণ পোর্টেবল OUTPUT দিতে চলেছে তবে উইন্ডোজে os.linesep ভুল নয় not
গসডোর

5
@ গুড্ডর: মুল বক্তব্যটি হ'ল আপনি যদি os.linesepউইন্ডোজ স্পষ্টভাবে টেক্সট মোডে ব্যবহার করেন তবে ফলাফলটি \r\r\nযা ভুল তা নয়। "উইন্ডোজ ব্যবহার করে ..." অর্থহীন। সি রানটাইম লাইব্রেরি (এবং তাই পাইথন) পাঠ্য মোডে আউটপুট \nথেকে অনুবাদ \r\nকরে। অন্যান্য সফ্টওয়্যার অন্যরকম আচরণ করতে পারে। এটি এমন নয় যে \nপাঠ্য মোডে পড়ার সময় উইন্ডোজ চলমান সমস্ত সফ্টওয়্যার একটি লোনকে একটি লাইন বিভাজক হিসাবে স্বীকৃতি দেয় । পাইথন করে। মাইক্রোসফ্টের নোটপ্যাড পাঠ্য সম্পাদক এটি করেন না।
জন মাচিন

6
যুক্তিযুক্তভাবে অন্য কেউ এটি পড়বে, আপনি নয়, কিছু মিকি-মাউস সফ্টওয়্যার দিয়ে অতিরিক্ত বাড়িয়ে দেবে \r...
জন মাচিন

2
@ গুডোর আপনি কি আলাদা ভাষা থেকে অজগরটিতে আসছেন, যেখানে উইন্ডোতে '\ n' ফলাফলের পরিবর্তে '\ n using' ব্যবহার করে '\ r \ n' - এর ফলে এটি বোবা দ্বারা প্রত্যাশিত '\ r' এর অভাব রয়েছে পাঠ্য সম্পাদক? জন যেমন বলেছে, পাইথন এর মতো আচরণ করে না - '। N' স্বয়ংক্রিয়ভাবে '\ r \ n' দ্বারা প্রতিস্থাপিত হয়, যদি ওএস.লাইনসপ এটি করতে বলে তবে। সুতরাং, এখানে স্পষ্টতই "ভুল" বলা os.linesep হচ্ছে । এর মত Department of Redundancy Department। হ্যাঁ, আপনি এটা করতে পারেন. না, আপনি চান না।
টুলমেকারস্টেভ

55

আমি "সঠিক" উপায় আছে বলে মনে করি না।

আমি ব্যবহার করব:

with open ('myfile', 'a') as f: f.write ('hi there\n')

স্মৃতি টিম পার্ষদ


তবে ওপি ফাইলটিতে অতিরিক্ত জিনিস লিখতে চাইতে পারে। এখানে withসুযোগটি বাইরে গেলে ফাইলটি বন্ধ হয়ে যাবে।
কিথ

এটি হতে পারে open(..., 'a')বা এমনকি হতে চাই 'at'
mtrw

5
আর্ম, হ্যাঁ এটি দিয়ে ব্যবহার করার ধারণা। আপনি যদি ফাইলটি উন্মুক্ত রাখতে চান, কেবল শুরুতে খোলা কল করুন এবং আপনার হয়ে গেলে কল করুন ...
হাইপারবোরাস

1
@mtrw। সত্য। ওপি সংযোজন ছিল।
হাইপারবোরিয়াস

1
যতদূর পাইথন সংশ্লিষ্ট হয় চেরা টিম পার্ষদ - এবং খুব খুব খুব আইনসঙ্গতভাবে তাই
Mr_and_Mrs_D

21

পাইথন 3 এ এটি একটি ফাংশন, তবে পাইথন 2 এ আপনি এটি উত্স ফাইলটির শীর্ষে যুক্ত করতে পারেন:

from __future__ import print_function

তাহলে তুমি করো

print("hi there", file=f)

17

আপনি যদি প্রচুর ডেটা এবং গতি লিখছেন তবে আপনার সম্ভবত এটি করা উচিত f.write(...)। আমি একটি দ্রুত গতির তুলনা করেছি এবং এটি print(..., file=f)প্রচুর পরিমাণে লেখার তুলনায় যথেষ্ট দ্রুত ছিল ।

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

writeআমার মেশিনে গড়ে 2.45 সেকেন্ডে শেষ হয়েছে, যেখানে printপ্রায় 4 গুণ বেশি সময় লেগেছে (9.76s)। বলা হচ্ছে, বেশিরভাগ বাস্তব-বিশ্বের পরিস্থিতিতে এটি কোনও সমস্যা হবে না।

আপনি যদি আপনার সাথে যেতে print(..., file=f)চান তবে সম্ভবত আপনি খুঁজে পাবেন যে আপনি সময়-সময়ে নতুন লাইনটি দমন করতে চান, বা অন্য কোনও কিছু দিয়ে এটি প্রতিস্থাপন করতে চাইবেন। এটি alচ্ছিক endপ্যারামিটার স্থাপন করে করা যেতে পারে , যেমন;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

আপনি যে কোনও উপায়েই বেছে নিন আমি withএটি ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটি কোডটি পড়া আরও সহজ করে তোলে।

আপডেট : পারফরম্যান্সের এই পার্থক্যটি সত্য দ্বারা ব্যাখ্যা করা হয়েছেwrite সত্যভাবে অত্যন্ত বাফার হয়েছে এবং ডিস্কে কোনও লেখার আগে ফিরে আসার আগে ফিরে আসে ( এই উত্তরটি দেখুন ), যেখানে print(সম্ভবত) লাইন বাফারিং ব্যবহার করা হয়। এটির জন্য একটি সহজ পরীক্ষা হ'ল দীর্ঘ লেখার জন্য পারফরম্যান্স পরীক্ষা করাও যেখানে লাইন বাফারিংয়ের অসুবিধাগুলি (গতির দিক দিয়ে) কম উচ্চারণ করা হবে।

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

পারফরম্যান্স পার্থক্যটি এখন খুব কম স্পষ্ট হয়ে ওঠে, গড় 2.20 এর জন্য writeসময়কাল এবং 3.10 এর জন্য print। এই দীর্ঘ লাইনের পারফরম্যান্সটি পেতে যদি আপনার বেশ কয়েকটি স্ট্রিং যুক্ত করতে হয় তবে ব্যবহারের ক্ষেত্রে যেখানে printআরও দক্ষ হবে তা কিছুটা বিরল।


10

৩.৫ থেকে আপনি pathlibসেই উদ্দেশ্যে এটি ব্যবহার করতে পারেন :

Path.write_text(data, encoding=None, errors=None)

পাঠ্য মোডে নির্দেশিত ফাইলটি খুলুন, এতে ডেটা লিখুন এবং ফাইলটি বন্ধ করুন:

import pathlib

pathlib.Path('textfile.txt').write_text('content')

5

আপনি যখন লাইন বলেছেন তখন এর অর্থ কিছু ক্রমিক অক্ষর যা '\ n' অক্ষরগুলিতে শেষ হয়। লাইনটি এক পর্যায়ে শেষ হওয়া উচিত তাই আমাদের প্রতিটি লাইনের শেষে '\ n' বিবেচনা করা উচিত। সমাধান এখানে:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write("Hello")

প্রতিটি লিখার পরে সংযোজন মোডে কার্সারটি নতুন লাইনে চলে আসে, আপনি wমোডটি ব্যবহার করতে চাইলে \nআপনার write()ফাংশন শেষে অক্ষর যুক্ত করা উচিত :

the_file.write("Hello\n")

1
"প্রতিটি লিখার পরে সংযোজন মোডে কার্সারটি নতুন লাইনে চলে আসে" - না এটি নয়।
এ সে

3

এক ioহিসাবে মডিউলটি ব্যবহার করতে পারেন :

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)

1

ফ্লাস্কে কোনও ফাইলে লেখার জন্য ব্যবহার করা যেতে পারে:

filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()

0

আপনি চেষ্টা করতে পারেন filewriter

pip install filewriter

from filewriter import Writer

Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]

লিখেছেন my_file.txt

একটি পুনরাবৃত্তযোগ্য বা __str__সমর্থন সহ একটি অবজেক্ট নেয় ।


0

যখন আমাকে নতুন লাইনগুলি বেশি লিখতে হবে, আমি একটি লাম্বদা সংজ্ঞায়িত করি যা একটি printফাংশন ব্যবহার করে:

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

এই পদ্ধতির সুবিধা রয়েছে যা এটি printফাংশনের সাথে উপলব্ধ সমস্ত বৈশিষ্ট্য ব্যবহার করতে পারে।

আপডেট: মন্তব্য বিভাগে জর্জি যেমন উল্লেখ করেছেন , partialফাংশনটির মাধ্যমে এই ধারণাটি আরও উন্নত করা সম্ভব :

from functools import partial
fwl = partial(print, file=out)

আইএমএইচও, এটি একটি আরও কার্যকরী এবং কম ক্রিপ্টিক পদ্ধতির।


2
অথবা অন্য (সম্ভবত ক্লিনার) এই লিখতে: from functools import partial; fwl = partial(print, file=out)
জর্জি

@ জর্জি আপনার পদ্ধতির এত ভাল যে এটি একটি নতুন উত্তর হিসাবে দেওয়া যেতে পারে।
এমএক্সএনএক্স

1
ধারণাটি আপনার মত একই, কেবল বাস্তবায়ন কিছুটা আলাদা। আপনি যদি চান তবে এটি আপনার উত্তরের সম্পাদনায় যুক্ত করতে পারেন। আমি এটা ঠিক আছে।
জর্জি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.