পাইথনে কার্যকারিতার মতো স্প্রিন্টফ


131

আমি sprintfপাইথনের সি-স্টাইল কার্যকারিতা ব্যবহার করে প্রচুর প্রসেসিং, ফর্ম্যাট করতে এবং শেষ পর্যন্ত একটি টেক্সট ফাইলে বাফারটি লিখতে একটি স্ট্রিং বাফার তৈরি করতে চাই । শর্তাধীন বিবৃতিগুলির কারণে, আমি এগুলি সরাসরি ফাইলে লিখতে পারি না।

উদাঃ সিউডো কোড:

sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)

সুতরাং আউটপুট ফাইলে আমাদের কাছে এই ধরণের o / p রয়েছে:

A= foo B= bar
C= ded
etc...

আমার প্রশ্নটি স্পষ্ট করতে সম্পাদনা করুন:
buf একটি বড় বাফারে স্প্রিন্টফ ব্যবহার করে ফর্ম্যাট করা এই সমস্ত স্ট্রিং রয়েছে। আপনার উদাহরণগুলি অনুসরণ করে bufকেবলমাত্র বর্তমান মানগুলি হবে, পুরানো মানগুলি নয়। যেমন প্রথম bufআমি লিখেছি A= something ,B= somethingপরে C= somethingএকই যোগ করা হয়েছিল buf, কিন্তু আপনার পাইথন উত্তর bufশুধুমাত্র গত মান রয়েছে, যা আমি চাই - আমি চাই bufসব আছে printfগুলি আমি শুরু থেকে করেছি, মত C


1
স্প্রিন্টফ () সি-তে যেভাবে কাজ করে তা নয় (এটি শুরুতে সামগ্রীগুলি লিখেছেন buf, শেষের দিকে নয়)) সম্ভবত স্ট্রিংগুলির একটি অ্যারে ব্যবহার করার পক্ষে এটি সম্ভবত সবচেয়ে ভাল কাজ করবে, তারপরে আপনি ফাইলটিতে লেখার আগে তাদের সাথে একসাথে যোগদান করুন।
ইয়াম 655

@ ডিভিডিবিজারো সাধারণ প্রোগ্রামিংয়ের ভাষা হওয়ায় এটি কি পাইথনে তুচ্ছ নয়? উদাহরণস্বরূপ, মাইকেল জে বারবারের সমাধান (আপনার মন্তব্যের পরে পোস্ট করা) দেখুন। def sprintf(buf, fmt, *args): ...
jdk1.0

@ jdk1.0 আমি কী বলতে চাইছিলাম তা আমি জানি না, আমি অল্প বয়স্ক এবং নিষ্পাপ পাইথন প্রোগ্রামার ছিলাম ... এই প্রশ্নটি আসলে অদ্ভুত কারণ এই বাফার পুনরায় ব্যবহার জিনিসটি এত সহজ নয়, আপনার আউটপুট সহ একটি পয়েন্টার বৃদ্ধি করতে হবে প্রতিটি স্প্রিন্টফ কল, এবং এই জাতীয় জিনিস এমন কিছু নয় যা আপনি পাইথন করছেন তা নিয়ে আপনার চিন্তিত হওয়া উচিত। যাইহোক, আমি আনন্দিত আমি স্কালায় চলে এসেছি এবং এখন জুলিয়া!
ডিভাইডবিজারো

উত্তর:


169

পাইথনের এর %জন্য অপারেটর রয়েছে ।

>>> a = 5
>>> b = "hello"
>>> buf = "A = %d\n , B = %s\n" % (a, b)
>>> print buf
A = 5
 , B = hello

>>> c = 10
>>> buf = "C = %d\n" % c
>>> print buf
C = 10

সমস্ত সমর্থিত ফর্ম্যাট স্পেসিফায়ারদের জন্য এই রেফারেন্সটি দেখুন ।

আপনি পাশাপাশি ব্যবহার করতে পারেন format:

>>> print "This is the {}th tome of {}".format(5, "knowledge")
This is the 5th tome of knowledge

40

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে ফর্ম্যাট () হ'ল আপনি যা খুঁজছেন তা হ'ল তার ক্ষুদ্র ভাষা সহ

পাইথন ২.7 এবং তার বেশি নির্বিকার উদাহরণ:

>>> print "{} ...\r\n {}!".format("Hello", "world")
Hello ...
 world!

পূর্ববর্তী অজগর সংস্করণগুলির জন্য: (২.6.২ দিয়ে পরীক্ষিত)

>>> print "{0} ...\r\n {1}!".format("Hello", "world")
Hello ...
 world!

4
আপনার সম্ভবত লক্ষ্য করা উচিত যে সংস্করণটি কেবল পাইথন 3 এ কাজ করে Py পাইথন ২.6 এ উদাহরণস্বরূপ, আপনাকে এটি করতে হবে:"{0} ...\r\n {1}!".format("Hello", "world")
লংগায়ারকে

1
আমার উত্তর সম্পাদনা করে তা অন্তর্ভুক্ত করতে; এটি অজগর ২.7 এর জন্যও কাজ করে না!
নিকোলাস লেফেব্রে

20

আমি আপনার লক্ষ্যটি বুঝতে পেরেছি তা সম্পূর্ণরূপে নিশ্চিত নয় তবে আপনি StringIOউদাহরণটি বাফার হিসাবে ব্যবহার করতে পারেন :

>>> import StringIO 
>>> buf = StringIO.StringIO()
>>> buf.write("A = %d, B = %s\n" % (3, "bar"))
>>> buf.write("C=%d\n" % 5)
>>> print(buf.getvalue())
A = 3, B = bar
C=5

বিপরীতে sprintf, আপনি কেবল একটি স্ট্রিং এতে পাস করেন buf.write, এটি %অপারেটর বা এর সাথে ফর্ম্যাট করেformat স্ট্রিংয়ের পদ্ধতিতে ।

আপনি যে sprintfইন্টারফেসটি আশা করছেন তা পেতে আপনি অবশ্যই কোনও ফাংশন সংজ্ঞায়িত করতে পারেন :

def sprintf(buf, fmt, *args):
    buf.write(fmt % args)

যা এ জাতীয়ভাবে ব্যবহৃত হবে:

>>> buf = StringIO.StringIO()
>>> sprintf(buf, "A = %d, B = %s\n", 3, "foo")
>>> sprintf(buf, "C = %d\n", 5)
>>> print(buf.getvalue())
A = 3, B = foo
C = 5

2
স্ট্রিং ফর্ম্যাটিং অপারেটর (%) দিয়ে * আরগস কীভাবে ব্যবহার করবেন তা আমাকে দেখানোর জন্য +1।
কার্টিস ইয়ালাপ

পাইথন 3 ব্যবহারের io.StringIO()পরিবর্তে
ওল্ফ


11

আপনি স্ট্রিং বিন্যাস ব্যবহার করতে পারেন:

>>> a=42
>>> b="bar"
>>> "The number is %d and the word is %s" % (a,b)
'The number is 42 and the word is bar'

তবে এটি পাইথন 3 এ সরিয়ে ফেলা হয়েছে, আপনার "str.format ()" ব্যবহার করা উচিত:

>>> a=42
>>> b="bar"
>>> "The number is {0} and the word is {1}".format(a,b)
'The number is 42 and the word is bar'

4
ভুল, পাইথন 3 এ এটি সরানো হয় না Py পাইথন 3.0 বলেছিল এটি 3.1 এ অবমূল্যায়ন করা হবে তবে আমি বিশ্বাস করি যে এটি কখনও ঘটেনি। ব্যবহার format()পছন্দনীয় হতে পারে তবে %ফর্ম্যাটিং এখনও বিদ্যমান। ( Mail.python.org/pipermail/python-dev/2009- সেপ্টেম্বর/092399 এইচটিএমএল কেন কিছু অবহিত হয়নি তার কারণের জন্য)
ডানকান

1
@Duncan; ধন্যবাদ, আমি এটা জানতাম না আমি কোথাও পড়েছি এটি অবহ্রাসিত হয়েছে এবং আবার কখনও চেষ্টা করে না :)।
utdemir

7

একটি দীর্ঘ দীর্ঘ স্ট্রিং inোকানোর জন্য তারা সঠিক অবস্থানের আশায় পরিবর্তে বিভিন্ন যুক্তির জন্য নাম ব্যবহার করা ভাল। এটি একাধিক পুনরাবৃত্তি প্রতিস্থাপন করা আরও সহজ করে তোলে।

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'

ফর্ম্যাট উদাহরণ থেকে নেওয়া হয়েছে , যেখানে অন্যান্য সমস্ত Formatসম্পর্কিত উত্তরগুলিও প্রদর্শিত হয়।


3

এটি সম্ভবত আপনার সি কোড থেকে পাইথন কোডের নিকটতম অনুবাদ।

A = 1
B = "hello"
buf = "A = %d\n , B= %s\n" % (A, B)

c = 2
buf += "C=%d\n" % c

f = open('output.txt', 'w')
print >> f, c
f.close()

%পাইথন মধ্যে অপারেটর সি এর মত প্রায় হুবহু একই জিনিস আছে sprintf। আপনি স্ট্রিংটি সরাসরি কোনও ফাইলে মুদ্রণ করতে পারেন। যদি এতে প্রচুর স্ট্রিং ফর্ম্যাট স্ট্রিংলেট যুক্ত থাকে তবে এটি ব্যবহার করা বুদ্ধিমানের কাজ হতে পারেStringIO প্রসেসিংয়ের সময় বাড়ানোর বিষয় ।

সুতরাং এটি করার পরিবর্তে +=, এটি করুন:

import cStringIO
buf = cStringIO.StringIO()

...

print >> buf, "A = %d\n , B= %s\n" % (A, B)

...

print >> buf, "C=%d\n" % c

...

print >> f, buf.getvalue()

3

আপনি যদি পাইথন 3 মুদ্রণ ফাংশনের মতো কিছু চান তবে স্ট্রিংয়ের জন্য:

def sprint(*args, **kwargs):
    sio = io.StringIO()
    print(*args, **kwargs, file=sio)
    return sio.getvalue()
>>> x = sprint('abc', 10, ['one', 'two'], {'a': 1, 'b': 2}, {1, 2, 3})
>>> x
"abc 10 ['one', 'two'] {'a': 1, 'b': 2} {1, 2, 3}\n"

বা '\n'শেষে ছাড়া :

def sprint(*args, end='', **kwargs):
    sio = io.StringIO()
    print(*args, **kwargs, end=end, file=sio)
    return sio.getvalue()
>>> x = sprint('abc', 10, ['one', 'two'], {'a': 1, 'b': 2}, {1, 2, 3})
>>> x
"abc 10 ['one', 'two'] {'a': 1, 'b': 2} {1, 2, 3}"

1

কিছুটা এইরকম...

greetings = 'Hello {name}'.format(name = 'John')

Hello John

এটি কনসোলে একটি স্ট্রিং মুদ্রণ করে, কোনও স্ট্রিংকে নয়, যা ওপি চেয়েছিল।
তীমু লইস্তি

এটি% s স্ক্রিনেও মুদ্রিত হয়েছে, যা প্রত্যাশিত ছিল না; তবে আমি পছন্দ করি যে আমি কমা দিয়ে একাধিক ভেরিয়েবল যুক্ত করতে পারি।
b01


0

দুটি পন্থা হ'ল স্ট্রিং বাফারে লিখতে বা একটি তালিকায় লাইন লিখতে এবং পরে তাদের সাথে যোগ দিতে। আমি মনে করি এই StringIOপদ্ধতিরটি বেশি পাইথনিক, তবে পাইথন ২. 2.-এর আগে কাজ করে নি।

from io import StringIO

with StringIO() as s:
   print("Hello", file=s)
   print("Goodbye", file=s)
   # And later...
   with open('myfile', 'w') as f:
       f.write(s.getvalue())

আপনি এগুলি ContextMananger( s = StringIO()) ছাড়াই ব্যবহার করতে পারেন । বর্তমানে, আমি একটি printফাংশন সহ একটি প্রসঙ্গ পরিচালক ব্যবহার করছি class এই খণ্ডটি ডিবাগিং বা বিজোড় পেজিং প্রয়োজনীয়তা সন্নিবেশ করতে সক্ষম হতে কার্যকর হতে পারে:

class Report:
    ... usual init/enter/exit
    def print(self, *args, **kwargs):
        with StringIO() as s:
            print(*args, **kwargs, file=s)
            out = s.getvalue()
        ... stuff with out

with Report() as r:
   r.print(f"This is {datetime.date.today()}!", 'Yikes!', end=':')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.