আমি কীভাবে ফাঁক দিয়ে পাইথন স্ট্রিংটি পূরণ করতে পারি?


508

আমি ফাঁকা জায়গা দিয়ে একটি স্ট্রিং পূরণ করতে চাই। আমি জানি যে নিম্নলিখিতগুলি শূন্যের জন্য কাজ করে:

>>> print  "'%06d'"%4
'000004'

তবে আমি যখন এটি চাই তখন আমার কী করা উচিত ?:

'hi    '

অবশ্যই আমি স্ট্রিংয়ের দৈর্ঘ্য পরিমাপ করতে পারি এবং করতে পারি str+" "*leftoverতবে আমি সবচেয়ে সংক্ষিপ্ততম উপায়টি চাই।


1
আমি জানি ভবিষ্যতে এটি হ্রাস করা যেতে পারে তবে আমি এখনও এই ভাল পুরানো পদ্ধতিটি পছন্দ করি: "%-6s" % sবাম-সংলগ্ন এবং "%6s" % sডান-প্রান্তিককরণের জন্য।
বাসজ

উত্তর:


698

আপনি এটি দিয়ে এটি করতে পারেন str.ljust(width[, fillchar]):

দৈর্ঘ্যের প্রস্থের একটি স্ট্রিংয়ে ন্যায়সঙ্গত বাম স্ট্রিংটি ফিরিয়ে দিন । প্যাডিং নির্দিষ্ট ফিলচার (ডিফল্ট একটি স্থান) ব্যবহার করে করা হয়। প্রস্থের চেয়ে কম হলে মূল স্ট্রিংটি ফেরত দেওয়া হয় len(s)

>>> 'hi'.ljust(10)
'hi        '

18
আরও জটিল স্ট্রিং ফর্ম্যাট করার সময় @ সিমনের উত্তর আরও নমনীয় এবং আরও কার্যকর
CoatedMoose

3
বা @abbot গুলি যদি আপনি পাইথনের পুরানো সংস্করণগুলি সমর্থন করে আটকে থাকেন
কোয়েটডমস ২

1
ljust () এখন অবচয় করা হয়েছে। দেখুন stackoverflow.com/questions/14776788/... এটা করার সঠিক উপায় হল জন্য
Mawg বলেছেন পুনর্বহাল মনিকা

অজগর 3 এ গেল? শুধু যোগ করার জন্য সেখানে rjust এবং চেয়েছিলেন কেন্দ্র যা কাজ একই ভাবে কিন্তু বিভিন্ন বিন্যাস জন্য
radtek

17
ljust (), rjust () কেবল স্ট্রিং মডিউল থেকে অবহেলা করা হয়েছে। এগুলি আরআর বিল্টিন টাইপে পাওয়া যায়।
রোহান গ্রোভার

372

একটি নমনীয় পদ্ধতি যে এমনকি কাজ করে জটিল স্ট্রিং বিন্যাস, আপনি সম্ভবত ব্যবহার করা উচিত জন্য স্ট্রিং-বিন্যাস মিনি ভাষার , হয় ব্যবহার str.format()পদ্ধতি

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

এর F-স্ট্রিং

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'

11
আপনার যদি ভেরিয়েবলে '16' থাকে?
র্যান্ডি

আমি এটাও বুঝতে পেরেছি। এটি পোস্ট করা উচিত ছিল। দস্তাবেজগুলি বলছে এটি Py2.6 এর জন্য কাজ করা উচিত, তবে আমার অনুসন্ধানগুলি অন্যথায়। যদিও পাই 2.7 এ কাজ করে।
র্যান্ডি

1
যখন আমি জাতীয় উচ্চারণ ব্যবহার করছিলাম তখন এই ধরণের ফর্ম্যাটটিতে আমার সমস্যা ছিল। আপনি চাইবেন যে 'ক্রা' এবং 'ক্রি' একই হোক, তবে তারা তা ছিল না।
কোয়াপকা

77
@ র্যান্ডি'{message: <{fill}}'.format(message='Hi', fill='16')
সিভিফ্যান 25'15

19
str.format()কেবলমাত্র একটি একক {...}এবং অন্য কিছু সহ টেমপ্লেটগুলির জন্য ব্যবহার করবেন না । শুধু ব্যবহার format()ফাংশন এবং নিজেকে রক্ষা ওভারহেড পার্স: format('Hi', '<16')
মার্টিজন পিটারস

119

নতুন (ইশ) স্ট্রিং ফর্ম্যাট পদ্ধতিটি আপনাকে নেস্টেড কীওয়ার্ড আর্গুমেন্টের সাথে মজাদার কিছু করতে দেয়। সবচেয়ে সহজ কেস:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

আপনি যদি 16ভেরিয়েবল হিসাবে পাস করতে চান :

>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

আপনি যদি পুরো কিট এবং কাবুদলের জন্য ভেরিয়েবলগুলি পাস করতে চান তবে :

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

যার ফলাফল (আপনি এটি অনুমান করেছিলেন):

'Hi              '

আপনি কীভাবে বার্তাটি বিভিন্নভাবে পরিচালনা করবেন? msgs = ['হাই', 'হ্যালো', 'সিওও']
ak_slick

1
@ak_slick আপনি ফরম্যাট ফাংশনে হার্ড কোডিং মানগুলির পরিবর্তে ভেরিয়েবলগুলিতে পাস করতে পারেন।
সিভিফ্যান

80

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

print "'%-100s'" % 'hi'

"'% -6s'"% 'হাই' প্রিন্ট করুন!
টেপার

8
@simon যেমন কেউ একটি python2.5 সিস্টেমে আটকে এই উত্তর আমাকে সাহায্য, না একটি বেহুদা উত্তর +1 টি
sunshinekitty

18
3.3+ এ আর কোনও অবমাননা করা হয়নি
সেপ্পো এরভিয়েল

3
আমি এই সাধারণ প্রিন্টফ সিনট্যাক্সটি আরও ভাল পছন্দ করি। আপনাকে অসংখ্য যুক্তি ছাড়াই জটিল স্ট্রিং লিখতে দেয়।
ম্যাক্স টিসেপকভ

4
সম্পূর্ণতার জন্য, "'%+100s'" % 'hi'ডান দিকে শূণ্যস্থান নির্বাণ জন্য কাজ করবে'hi'
এরিক Blum

62

এটি করার সঠিক উপায়টি হবে অফিসিয়াল ডকুমেন্টেশনে বর্ণিত পাইথনের বিন্যাস সিনট্যাক্স ব্যবহার করা

এই ক্ষেত্রে এটি সহজভাবে হবে:
'{:10}'.format('hi')
যা ফলাফল:
'hi '

ব্যাখ্যা:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

খুব সুন্দর আপনার জানা দরকার সেখানে there

আপডেট: পাইথন ৩. as হিসাবে এটি আক্ষরিক স্ট্রিং অন্তরঙ্গকরণের সাথে আরও বেশি সুবিধাজনক!

foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!

37

ব্যবহার str.ljust():

>>> 'Hi'.ljust(6)
'Hi    '

এছাড়াও আপনি বিবেচনা করা উচিত string.zfill(), str.ljust()এবং str.center()স্ট্রিং বিন্যাস করার জন্য। এগুলি শৃঙ্খলিত করা যায় এবং এইভাবে ' ফিল ' অক্ষর নির্দিষ্ট করা যায়:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

এই স্ট্রিং বিন্যাস অপারেশনগুলির পাইথন ভি 2 এবং ভি 3 তে কাজ করার সুবিধা রয়েছে।

কিছু pydoc strসময় দেখুন: সেখানে ভাল জিনিস প্রচুর আছে।


27

পাইথন ৩.6 হিসাবে আপনি ঠিক করতে পারেন

>>> strng = 'hi'
>>> f'{strng: <10}'

সঙ্গে আক্ষরিক স্ট্রিং ক্ষেপক

অথবা, যদি আপনার প্যাডিংয়ের আকারটি কোনও ভেরিয়েবলে থাকে তবে এর মতো (ধন্যবাদ @ ম্যাট এম!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'

4
f'{strng: >10}'10 দশকের দৈর্ঘ্যে শীর্ষস্থানীয় সাদা অংশের সাথে স্ট্রিং পূরণের জন্য That এটি যাদু। এবং এটি ভাল নথিভুক্ত করা হয় না।
চাং ই

@ চাঁচে আমার বিশ্বাস এটিও এর পূর্বনির্ধারিত আচরণ f'{strng:10}'
ডাব্লুএফএফ

17

আপনি আপনার স্ট্রিংটিও কেন্দ্র করতে পারেন :

'{0: ^20}'.format('nice')

7

স্ট্রিংগুলির জন্য পাইথন ২.7 এর মিনি ফর্ম্যাটিংটি ব্যবহার করুন :

'{0: <8}'.format('123')

এই বামটি প্রান্তিককরণ করে এবং '' অক্ষর দিয়ে 8 টি অক্ষরে প্যাড দেয়।


4
@ সিমন ইতিমধ্যে এই উত্তরটি দিয়েছেন ... কেন নকল উত্তর পোস্ট করবেন?
ফেলিক্স ক্লিং

5
আমি 'নতুন প্রতিক্রিয়া পোস্ট করা হয়েছে, রিফ্রেশ করতে ক্লিক করুন' ক্লিক না এবং তাই এটি মিস।
এডজ


2

এটি কাটা কাটা ব্যবহার করা কি অজগর নয়?

উদাহরণস্বরূপ, 10 টি অক্ষর দীর্ঘ না হওয়া পর্যন্ত ডানদিকে ফাঁক দিয়ে একটি স্ট্রিং প্যাড করা:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

এটি 15 অক্ষর দীর্ঘ না হওয়া অবধি এটিকে বামদিকে ফাঁকা রাখার জন্য:

>>> (" " * 15 + x)[-15:]
'         string'

অবশ্যই আপনি কতক্ষণ প্যাড করতে চান তা জেনে রাখা দরকার, তবে আপনি যে স্ট্রিংটি শুরু করছেন তার দৈর্ঘ্যটি পরিমাপ করার প্রয়োজন নেই।


9
না এটা হবে না।
ম্যাড পদার্থবিজ্ঞানী

1
আপনি কি এ সম্পর্কে বিস্তারিত বলতে পারেন? আমি আপনাকে বিশ্বাস করি না এমন নয়, আমি কেন এটি বুঝতে চাই।
জেভ চোনোলস

4
অবশ্যই। সর্বাধিক পাইথোনিক উপায় হ'ল যতটা সম্ভব হোমগ্রাউন দ্রবণ ব্যবহার করার চেয়ে বিল্টিন ফাংশনগুলির একটি ব্যবহার করা।
ম্যাড পদার্থবিদ

@ ম্যাডফিসিসিস্ট বলেছেন যে স্লাইসিং কম পাইথোনিক কারণ আপনার বিল্ট ফাংশনগুলিতে ব্যবহার করা উচিত যেমন বলা ''.join(reversed(str))তার চেয়ে বেশি পাইথোনিক str[::-1]এবং আমরা সকলেই জানি যে এটি সত্য নয়।
নিক

@NickA। এটি খুব ভাল উপমা নয়। উদাহরণ হিসাবে আপনি যে কেসটি ব্যবহার করছেন সেটি বেশ কার্যকর। যাইহোক, (x + " " * 10)[:10]আমার মতে ব্যবহারের চেয়ে অনেক বেশি সংশ্লেষিত x.ljust(10)
ম্যাড পদার্থবিদ

0

বিভিন্ন মুদ্রণ বিন্যাসের জায়গায় ব্যবহার করার জন্য একটি দুর্দান্ত কৌশল:

(1) ডানদিকে ফাঁকা স্থান সহ প্যাড:

('hi' + '        ')[:8]

(২) বাম দিকে অগ্রণী জিরো সহ প্যাড:

('0000' + str(2))[-4:]

1
কোনও কারণে এটি মজাদার উত্তর তবে আমি এটি পছন্দ করি। সেই রেখাগুলির পাশাপাশি এটিও বিবেচনা করুন: min_len = 8তারপরে ('hi' + ' '*min_len)[:min_len]বা('0'*min_len + str(2))[-min_len]
পোইকিলোস

1
সংখ্যার জন্য, এটি ('0'*min_len + str(2))[-min_len:]বরং হবে, যদিও এটি কেবল মজাদার জন্য, এবং আমি অন্যান্য উত্তরগুলির প্রস্তাব দিই।
পোইকিলোস

-1

আপনি তালিকা বোধগম্যতা ব্যবহার করে এটি করতে পারেন, এটি আপনাকে স্পেসগুলির সংখ্যা সম্পর্কে ধারণা দেবে এবং এটি একটি লাইনার হবে।

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '

... এবং তারপরে আপনি একটি স্ট্রিং পাবেন যা 22 (লেন ("হ্যালো") + 17 :() অক্ষর দীর্ঘ - এটি ভাল হয় নি we আমরা মজার হওয়ার সাথে সাথে আমরা করতে পারি s = "hi"; s + (6-len(s)) * " "পরিবর্তে (ঠিক আছে যখন ফলে, নেতিবাচক) কিন্ত উত্তর যা ব্যবহার যাই হোক না কেন ফ্রেমওয়ার্ক বৈশিষ্ট্য যা ঠিকানাগুলি সঠিক ইস্যু সহজ হবে (বজায় রাখার জন্য অন্যান্য উত্তর
Poikilos
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.