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


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.