मैं रिक्त स्थान के साथ पायथन स्ट्रिंग कैसे भर सकता हूं?


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
अधिक जटिल तारों को स्वरूपित करते समय @simon का उत्तर अधिक लचीला और अधिक उपयोगी होता है
CoatedMoose

3
या @abbot का अगर आप अजगर के पुराने संस्करणों का समर्थन करते हुए फंस गए हैं
CoatedMoose

1
ljust () अब पदावनत हो गया है। सही तरीके से करने के लिए stackoverflow.com/questions/14776788/… देखें
Mawg का कहना है कि मोनिका

अजगर 3 में चला गया? बस जोड़ना चाहता था वहाँ भी अन्याय और केंद्र है जो एक ही तरह से काम करते हैं लेकिन अलग-अलग संरेखण के लिए
radtek

17
ljust (), rjust () को स्ट्रिंग मॉड्यूल से ही हटा दिया गया है। वे उपलब्ध बिलिन प्रकार पर उपलब्ध हैं।
रोहन ग्रोवर

372

एक लचीली विधि के लिए जो जटिल स्ट्रिंग को स्वरूपित करने पर भी काम करती है, आपको संभवतः स्ट्रिंग-स्वरूपण वाली मिनी-भाषा का उपयोग करना चाहिए , या तो str.format()विधि का उपयोग करके

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

of f- स्ट्रिंग्स

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

11
यदि आपके पास एक चर में '16' है तो क्या होगा?
रैंडी

मुझे लगा कि बाहर भी। इसे पोस्ट करना चाहिए था। डॉक्स का कहना है कि इसे Py2.6 के लिए काम करना चाहिए, लेकिन मेरे निष्कर्ष अन्यथा हैं। हालांकि Py2.7 में काम करता है।
रैंडी

1
जब मैं राष्ट्रीय लहजे का उपयोग कर रहा था तो मुझे इस प्रकार के प्रारूपण की समस्या थी। आप चाहते हैं कि 'kra' और 'krá' समान हों, लेकिन वे नहीं थे।
क्वापका

77
@ रंडी'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan

19
str.format()केवल एक एकल {...}और कुछ नहीं के साथ टेम्पलेट्स के लिए उपयोग न करें । बस format()फ़ंक्शन का उपयोग करें और अपने आप को पार्सिंग ओवरहेड को बचाएं format('Hi', '<16'):।
मार्टिन पीटर्स

119

नया (ish) स्ट्रिंग प्रारूप विधि आपको नेस्टेड कीवर्ड तर्कों के साथ कुछ मजेदार चीजें करने देता है। सबसे सरल मामला:

>>> '{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              '

आप संदेश को अलग-अलग कैसे संभालेंगे? संदेश = [s हाय ’,
lo

1
@ak_slick आप फ़ंक्शन फ़ंक्शन में हार्ड-कोडित मूल्यों के बजाय चर में पास कर सकते हैं।
CivFan

80

आप यह कोशिश कर सकते हैं:

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

प्रिंट "'% -6 s'"% 'हाय' वास्तव में !!
टेपर

8
@simon के रूप में किसी ने python2.5 सिस्टम पर अटक इस जवाब ने मेरी मदद की, बेकार जवाब नहीं +1
sunshinekitty

18
3.3+ में किसी भी अधिक पदावनत नहीं
सेप्पो एर्विला

3
मुझे यह आम प्रिंटफ सिंटैक्स बहुत अच्छा लगता है। अनगिनत कॉन्टेक्शंस के बिना आपको जटिल स्ट्रिंग्स लिखने की अनुमति देता है।
मैक्स त्सेपकोव

4
पूर्णता के लिए, "'%+100s'" % 'hi'रिक्त स्थान डालने के लिए काम करेंगे'hi'
एरिक ब्लम

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" | "%"

बहुत ज्यादा सब तुम्हें पता है की जरूरत है ^।

अद्यतन: अजगर 3.6 के रूप में यह शाब्दिक स्ट्रिंग प्रक्षेप के साथ और भी अधिक सुविधाजनक है!

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....        '

इन स्ट्रिंग फॉर्मेटिंग ऑपरेशनों को पायथन v2 और v3 में काम करने का फायदा मिलता है।

कुछ pydoc strसमय के लिए देखें: वहाँ पर अच्छे सामानों का भंडार है।


27

अजगर 3.6 के रूप में आप बस कर सकते हैं

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

साथ शाब्दिक स्ट्रिंग प्रक्षेप

या, यदि आपके पैडिंग का आकार एक चर में है, तो इस तरह (धन्यवाद @ @ एम!)।

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

4
f'{strng: >10}'10 की लंबाई के लिए प्रमुख व्हाट्सएप के साथ स्ट्रिंग भरने के लिए। यह जादू है। और यह अच्छी तरह से प्रलेखित नहीं है।
चांग ये

@changye मेरा मानना ​​है कि यह भी डिफ़ॉल्ट व्यवहार है f'{strng:10}'
डब्ल्यूएएफ

17

आप अपनी स्ट्रिंग को भी केन्द्रित कर सकते हैं :

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

7

स्ट्रिंग के लिए पायथन 2.7 का मिनी स्वरूपण का उपयोग करें :

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

इसने संरेखित किया, और 'वर्ण' वाले 8 वर्णों को पैड दिया।


4
@ साइमन ने पहले ही यह जवाब दे दिया था ... डुप्लीकेट उत्तर पोस्ट क्यों कर रहा है?
फेलिक्स क्लिंग

5
मैंने 'नई प्रतिक्रियाओं को पोस्ट किया गया है, ताज़ा करने के लिए क्लिक करें' पर क्लिक नहीं किया और इसलिए वह चूक गया।
एनोडज


2

यह टुकड़ा करने की क्रिया का उपयोग करने के लिए अधिक पायथोनिक नहीं होगा?

उदाहरण के लिए, दाईं ओर रिक्त स्थान के साथ एक स्ट्रिंग पैड करने के लिए जब तक कि यह 10 वर्ण लंबा न हो:

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

15 वर्ण लंबे होने तक इसे बाईं ओर रिक्त स्थान पर रखने के लिए:

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

आपको यह जानने की आवश्यकता है कि आप कितने समय तक पैड करना चाहते हैं, लेकिन यह उस स्ट्रिंग की लंबाई को मापने की आवश्यकता नहीं है जिसे आप शुरू कर रहे हैं।


9
नहीं, यह नहीं होगा।
मैड फिजिसिस्ट

1
क्या आप इसे विस्तार में बताने में सक्षम हैं? ऐसा नहीं है कि मैं आप पर विश्वास नहीं करता, मैं सिर्फ यह समझना चाहता हूं कि क्यों।
ज़ेव चोनोल्स

4
ज़रूर। जितना संभव हो सके एक घरेलू समाधान का उपयोग करने के बजाय सबसे अधिक पाइथोनिक तरीका बिलिन कार्यों में से एक का उपयोग करना होगा।
पागल भौतिकविज्ञानी

@MadPhysicist का कहना है कि स्लाइसिंग कम पायथोनिक है क्योंकि आपको अंतर्निहित कार्यों में उपयोग करना चाहिए, यह कहना पसंद है कि ''.join(reversed(str))यह पाइथोनिक से अधिक है str[::-1], और हम सभी जानते हैं कि यह सच नहीं है।
निक

@NickA। यह बहुत अच्छी उपमा नहीं है। उदाहरण के रूप में आप जिस मामले का उपयोग कर रहे हैं वह काफी वैध है। हालाँकि, (x + " " * 10)[:10]मेरी राय में उपयोग करने की तुलना में बहुत अधिक जटिल है x.ljust(10)
मैड

0

विभिन्न प्रिंट प्रारूपों के स्थान पर उपयोग करने के लिए एक अच्छी चाल:

(1) दाईं ओर रिक्त स्थान के साथ पैड:

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

(2) बाईं ओर अग्रणी शून्य के साथ पैड:

('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 होती है (len ("hello") + 17 :() अक्षर लंबे - अच्छे नहीं हुए। जबकि हम मजाकिया होते जा रहे हैं हम कर सकते हैं s = "hi", s + (6-len(s)) * " "इसके बजाय (यह ठीक है जब; परिणाम नकारात्मक है)। हालांकि, ऐसे उत्तर जो सटीक रूपरेखा को संबोधित करते हैं, जो भी फ्रेमवर्क सुविधा का उपयोग करते हैं, उन्हें बनाए रखना आसान होगा (अन्य उत्तर देखें)।
पोइकिलोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.