পাইথনে স্ট্রিং ফর্ম্যাটিংয়ের জন্য একাধিক যুক্তি ব্যবহার করে (যেমন, '% s…% s')


174

আমার কাছে একটি স্ট্রিং রয়েছে যা দেখতে দেখতে '%s in %s'এবং আমি কীভাবে আর্গুমেন্টগুলি আলাদা করতে হবে তা জানতে চাই যাতে তারা দুটি আলাদা% s। আমার মন জাভা থেকে আগত এই সাথে আসে:

'%s in %s' % unicode(self.author),  unicode(self.publication)

তবে এটি কাজ করে না তাই পাইথনটিতে এটি কীভাবে দেখায়?

উত্তর:


191

মার্ক সিডের উত্তরটি সঠিক - আপনার একটি টিপল সরবরাহ করতে হবে।

তবে পাইথন ২.6 থেকে আপনি এর formatপরিবর্তে ব্যবহার করতে পারেন %:

'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))

%বিন্যাসের স্ট্রিং ব্যবহারের জন্য আর উত্সাহ দেওয়া হয় না।

স্ট্রিং ফর্ম্যাটিংয়ের এই পদ্ধতিটি পাইথন 3.0.০ এ নতুন মান, এবং নতুন কোডে স্ট্রিং ফর্ম্যাটিং অপারেশনে বর্ণিত% ফর্ম্যাটিংয়ের চেয়ে পছন্দ করা উচিত।


5
পাইথন ২.7 দিয়ে শুরু করে তিনি সূচী নম্বরটি ফেলে দিতে পারেন, অর্থাৎ একটি সরল '{} in {}'বিন্যাসের স্ট্রিং ব্যবহার করতে পারেন ।
ক্রিশ্চিয়ান সিউপিতু

121

আপনি যদি একাধিক যুক্তি ব্যবহার করেন তবে এটিতে একটি টিপলে থাকতে হবে (অতিরিক্ত বন্ধনী নোট করুন):

'%s in %s' % (unicode(self.author),  unicode(self.publication))

যেমন ইওএল দেখায়, unicode()ফাংশনটি সাধারণত অ্যাস্কি এনকোডিংটিকে ডিফল্ট হিসাবে ধরে নেয়, সুতরাং আপনার যদি অ-এসসিআইআই অক্ষর না থাকে তবে স্পষ্টভাবে এনকোডিংটি পাস করা নিরাপদ:

'%s in %s' % (unicode(self.author,'utf-8'),  unicode(self.publication('utf-8')))

এবং পাইথন 3.0.০ হিসাবে, str.format()পরিবর্তে সিনট্যাক্স ব্যবহার করা এটি পছন্দ :

'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))

60

একাধিক যুক্তির জন্য একটি টিপল / ম্যাপিং অবজেক্টে format

নিম্নলিখিতটি ডকুমেন্টেশন থেকে উদ্ধৃত হয়েছে:

প্রদত্ত format % values, %রূপান্তর স্পেসিফিকেশনগুলির formatশূন্য বা আরও বেশি উপাদানের সাথে প্রতিস্থাপন করা হয় values। প্রভাব sprintf()সি ভাষায় ব্যবহারের মতো ।

যদি formatএকটি একক যুক্তি প্রয়োজন হয়, মানগুলি একক নন-টিপল অবজেক্ট হতে পারে। তা না হলে, মান ঠিক দ্বারা নির্দিষ্ট আইটেম সংখ্যা সঙ্গে একটি tuple হতে হবে formatস্ট্রিং , বা একটি একক ম্যাপিং বস্তুর (উদাহরণস্বরূপ, একটি অভিধান)।

তথ্যসূত্র


str.formatপরিবর্তে চালু%

%অপারেটরের নতুন বিকল্পটি হ'ল ব্যবহার করা str.format। ডকুমেন্টেশনের একটি অংশ এখানে দেওয়া হয়েছে:

str.format(*args, **kwargs)

একটি স্ট্রিং ফর্ম্যাটিং অপারেশন সম্পাদন করুন। এই পদ্ধতিটি যে স্ট্রিংটিতে বলা হয় সেগুলিতে ধনুর্বন্ধনী দ্বারা সীমিত আক্ষরিক পাঠ্য বা প্রতিস্থাপন ক্ষেত্র থাকতে পারে {}। প্রতিটি প্রতিস্থাপন ক্ষেত্রের মধ্যে হয় অবস্থানগত আর্গুমেন্টের সংখ্যাসূচক সূচক বা কোনও কীওয়ার্ড আর্গুমেন্টের নাম। স্ট্রিংয়ের অনুলিপি প্রদান করে যেখানে প্রতিটি প্রতিস্থাপন ক্ষেত্রটি সম্পর্কিত আর্গুমেন্টের স্ট্রিংয়ের মান দিয়ে প্রতিস্থাপিত হয়।

এই পদ্ধতি পাইথন 3.0 নতুন মান, এবং পছন্দ করা উচিত %বিন্যাস

তথ্যসূত্র


উদাহরণ

এখানে কয়েকটি ব্যবহারের উদাহরণ দেওয়া হল:

>>> '%s for %s' % ("tit", "tat")
tit for tat

>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles

>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond

>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond

আরো দেখুন


এটি পরীক্ষা করার মতো আমার কোনও উপায় নেই (আমি পাইথনকে তেমন কিছুই জানি না) তবে উদাহরণগুলি দেখে মনে হয় যে এর মতো কিছুতে '{self.author} in {self.publication}'.format(self=self)"কাজ করা" উচিত। আমি পুরো unicodeবিষয়টি সম্পর্কে নিশ্চিত নই
বহুগেনুবিকেন্টস

1
হ্যাঁ, আপনি প্রকৃতপক্ষে বৈশিষ্ট্যগুলি (এবং সূচকগুলি) অ্যাক্সেস করতে পারেন। ডকস.পাইথন.আর. / লাইবারি / স্ট্রিং। Html# ফরম্যাটস্ট্রিংস দেখুন সুতরাং আপনার উদাহরণে আপনি {first[0]}প্রাথমিক পেতে ব্যবহার করতে পারতেন J
ডানকান

10

আপনাকে অবশ্যই মানগুলি বন্ধনীতে রেখে দিতে হবে:

'%s in %s' % (unicode(self.author),  unicode(self.publication))

এখানে, প্রথম স্থাপন করা হবে। এবং দ্বিতীয় জন্য , ব্যবহার করা হবে।%sunicode(self.author)%sunicode(self.publication)

দ্রষ্টব্য: string formattingআপনার %স্বরলিপি চিহ্নিত করা উচিত । আরও তথ্য এখানে


আমি বিশ্বাস করতে পারি না যে লোকেরা তারপরেও %sতারপরে প্রস্তাব দেয়format
ব্যবহারকারী 1767754

8

এখনও পর্যন্ত পোস্ট করা কিছু উত্তরগুলির সাথে একটি উল্লেখযোগ্য সমস্যা রয়েছে: unicode()ডিফল্ট এনকোডিং থেকে ডিকোড, যা প্রায়শই ASCII হয়; প্রকৃতপক্ষে, unicode()বাইটগুলি অক্ষরে রূপান্তরিত করে প্রদত্ত বাইটগুলির "জ্ঞান" তৈরি করার চেষ্টা করে। সুতরাং, নিম্নলিখিত কোডগুলি যা পূর্ববর্তী উত্তরগুলির দ্বারা প্রস্তাবিত মূলত আমার মেশিনে ব্যর্থ হয়:

# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))

দেয়:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

ব্যর্থতাটি authorকেবল আসকি বাইট (যেমন [0; 127] এর মান সহ) ধারণ করে না এবং unicode()এএসসিআইআই থেকে ডিফল্টরূপে (অনেকগুলি মেশিনে) ডেকেড হয় from

একটি শক্তিশালী সমাধান হ'ল স্পষ্টভাবে আপনার ক্ষেত্রগুলিতে ব্যবহৃত এনকোডিংটি দেওয়া; UTF-8 উদাহরণ হিসাবে গ্রহণ:

u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))

(অথবা uআপনি কোনও ইউনিকোড ফলাফল বা বাইট স্ট্রিং চান কিনা তার উপর নির্ভর করে প্রাথমিক ছাড়াই )।

এই মুহুর্তে, বিন্যাসের সময় ডিকোডিংয়ের পরিবর্তে, ক্ষেত্রগুলি authorএবং publicationক্ষেত্রগুলি ইউনিকোড স্ট্রিংগুলি বিবেচনা করতে পারে ।


5

পাইথন 2 এর জন্য আপনি এটিও করতে পারেন

'%(author)s in %(publication)s'%{'author':unicode(self.author),
                                  'publication':unicode(self.publication)}

বিকল্প হিসাবে যদি আপনার অনেক যুক্তি থাকে (বিশেষত যদি আপনি আন্তর্জাতিকীকরণ করছেন) তবে এটি কার্যকর

পাইথন 2.6 এর পরে সমর্থন করে .format()

'{author} in {publication}'.format(author=self.author,
                                   publication=self.publication)

4

আপনি এটি পরিষ্কার এবং সহজ ব্যবহার করতে পারেন (তবে ভুল! কারণ আপনারা formatমার্ক বাইয়ার্সের মতো ব্যবহার করা উচিত ) কাজটি করে:

print 'This is my %s formatted with %d arguments' % ('string', 2)

3

সম্পূর্ণতার জন্য, পাইথনে 3.6 এফ-স্ট্রিং PEP-498 এ প্রবর্তিত হয় । এই স্ট্রিংগুলি এটি সম্ভব করে তোলে

একটি ন্যূনতম সিনট্যাক্স ব্যবহার করে স্ট্রিং লিটারেলের ভিতরে এক্সপ্রেশন প্রকাশ করুন।

এর অর্থ হ'ল আপনার উদাহরণের জন্য আপনি এটিও ব্যবহার করতে পারেন:

f'{self.author} in {self.publication}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.