আমি কীভাবে পাইথন স্ট্রিংয়ে আক্ষরিক কোঁকড়ানো-ব্রেস অক্ষর মুদ্রণ করতে পারি এবং এটিতে ফর্ম্যাট ব্যবহার করতে পারি?


1505
x = " \{ Hello \} {0} "
print(x.format(42))

আমাকে দেয় : Key Error: Hello\\

আমি আউটপুট মুদ্রণ করতে চান: {Hello} 42


1
আরও দেখুন: stackoverflow.com/questions/35574349
dreftymac

9
যারা দ্বিগুণ ব্রেস ( {{ }}) বন্ধ করতে চান তাদের জন্য , ব্যবহার করুন string.Template। সেখানে আপনি ফর্মটির শনাক্তকারীদের বিকল্প দিন $foo(ল্যাটেক্স কোড উত্পন্ন করার জন্য সহজ)।
আইওনিস ফিলিপিসিস

যারা দ্বিগুণ ধনাত্মক ধনুর্বন্ধনী এড়াতে চান এবং যারা তাদের পাইথন প্রকল্পগুলিতে অন্য নির্ভরতা যুক্ত করতে বিরত নন, তাদের জন্য জিঞ্জা 2 রয়েছে যা ব্যবহারকারী-সংজ্ঞায়িত কাস্টম প্লেসহোল্ডার ডিলিমিটার সিনট্যাক্সকে অনুমতি দিয়ে এই সমস্যাটি সুনির্দিষ্টভাবে সমাধান করে।
dreftymac

উত্তর:


2064

আপনার দ্বিগুণ করতে হবে {{এবং }}:

>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '

ফর্ম্যাট স্ট্রিং সিনট্যাক্সের জন্য পাইথন ডকুমেন্টেশনের প্রাসঙ্গিক অংশটি এখানে :

ফর্ম্যাট স্ট্রিংগুলিতে কোঁকড়া ধনুর্বন্ধনী দ্বারা বেষ্টিত "প্রতিস্থাপন ক্ষেত্রগুলি" থাকে {}। ধনুর্বন্ধনী অন্তর্ভুক্ত নেই যে কোনও কিছুই আক্ষরিক পাঠ্য হিসাবে বিবেচনা করা হয়, যা আউটপুট অপরিবর্তিত অনুলিপি করা হয়। আপনার যদি আক্ষরিক পাঠ্যে একটি ধনুর্বন্ধনী অক্ষর অন্তর্ভুক্ত করা দরকার, তবে দ্বিগুণ করে এড়াতে পারবেন: {{এবং }}


264
সুতরাং আপনি যদি "{42}" মুদ্রণ করতে চান তবে আপনি ব্যবহার করুন "{{{0}}}".format(42)!
হিউজেস

7
আপনি যদি একটি একক কোঁকড়া ধনুর্বন্ধনী চান? "{ something { } {value}".format(42)কাজ করে না
এজেপি

14
"{{"। ফর্ম্যাট () এবং "}}"। ফর্ম্যাট () একক কোঁকড়া ধনুর্বন্ধনী মুদ্রণ। আপনার উদাহরণে: "{{কিছু {{}} {} 0}" মুদ্রণ করুন। ফর্ম্যাট (42) "{কিছু {} 42" মুদ্রণ করবে।
মার্ক দর্শক 21

2
কী {0}মানে?
কোডি বাগস্টিন

6
@ ইম্রে: {0}প্রথম যুক্তিকে বোঝায় .format()। আপনি একাধিক মান মুদ্রণ করতে পারবেন {0} {1} {2}যতক্ষণ আপনি একই সংখ্যার তর্ক যুক্ত করেন .format()। দেখুন docs.python.org/library/string.html#format-examples ব্যাপক উদাহরণের জন্য।
গ্রেগ হিউগিল


60

পাইথন 3.6+ (2017)

পাইথনের সাম্প্রতিক সংস্করণগুলিতে কেউ এফ-স্ট্রিং ব্যবহার করবে (এছাড়াও পিইপি 498 দেখুন )।

এফ-স্ট্রিংগুলির সাথে একটিতে ডাবল {{বা ব্যবহার করা উচিত}}

n = 42  
print(f" {{Hello}} {n} ")

কাঙ্ক্ষিত উত্পাদন করে

 {Hello} 42

আক্ষরিক পাঠ্য না ব্যবহারের পরিবর্তে যদি বন্ধনীগুলিতে আপনাকে একটি অভিব্যক্তি সমাধান করতে হয় তবে আপনার ব্র্যাপকেটের তিন সেট প্রয়োজন হবে:

hello = "HELLO"
print(f"{{{hello.lower()}}}")

উত্পাদন করে

{hello}

46

ওপি এই মন্তব্যটি লিখেছেন:

আমি কিছু উদ্দেশ্যে এই উদ্দেশ্যে একটি ছোট জেএসএন ফর্ম্যাট করার চেষ্টা করছিলাম: '{"all": false, "selected": "{}"}'.format(data)এরকম কিছু পাওয়ার জন্য{"all": false, "selected": "1,2"}

এটি অত্যন্ত সাধারণ যে JSON এর সাথে কাজ করার সময় "এস্কেটিং ব্রেসেস" সমস্যাটি উপস্থিত হয়।

আমি এটি করার পরামর্শ দিচ্ছি:

import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)

এটি বিকল্পের চেয়ে পরিষ্কার, যা হ'ল:

'{{"all": false, "selected": "{}"}}'.format(data)

ব্যবহার jsonগ্রন্থাগার স্পষ্টভাবে বাঞ্ছনীয় যখন JSON স্ট্রিংকে আরও একটি উদাহরণ চেয়ে জটিল পরার।


1
আমেন! এটি আরও কাজের মতো মনে হতে পারে তবে লাইব্রেরিগুলি কর্নার কাটা বনাম করণীয় যা করা উচিত তা করার জন্য লাইব্রেরি ব্যবহার করে ... আরও ভাল জিনিস তৈরি করে।
কওলিন ফায়ার

1
তবে পাইথন অবজেক্টে কীগুলির ক্রমটি গ্যারান্টিযুক্ত নয় ... তবুও, JSON লাইব্রেরিতে একটি JSON উপায়ে সিরিয়ালের জন্য গ্যারান্টিযুক্ত।
wizzwizz4

2
wizzwizz4: ভাল কথা। পাইথন ৩.6 থেকে, অভিধানগুলি সন্নিবেশয়ের আদেশ দেওয়া হয়েছে, সুতরাং এটি কোনও সমস্যা হবে না। পাইথনের ভার্সনগুলি 2.7 থেকে 3.5 এর মধ্যে সংগ্রহের পাঠাগার থেকে অর্ডারডিক্ট ব্যবহার করতে পারে।
twasbrillig

24

এটি করার চেষ্টা করুন:

x = " {{ Hello }} {0} "
print x.format(42)


14

যদিও এর চেয়ে ভাল না, কেবলমাত্র রেফারেন্সের জন্য, আপনি এটিও করতে পারেন:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

যখন কেউ মুদ্রণ করতে চায় এটি উদাহরণস্বরূপ কার্যকর হতে পারে {argument}। এটি এর চেয়ে বেশি পঠনযোগ্য'{{{}}}'.format('argument')

নোট করুন যে আপনি পাইথন ২.7 এর পরে যুক্তির অবস্থানগুলি (যেমন {}পরিবর্তে {0}) বাদ দেন


5

আপনি যদি এটি অনেক কিছু করতে চলেছেন তবে কোনও ইউটিলিটি ফাংশনটি সংজ্ঞায়িত করা ভাল হতে পারে যা আপনাকে তার পরিবর্তে স্বেচ্ছাচারী ব্রেস বিকল্প ব্যবহার করতে দেয়

def custom_format(string, brackets, *args, **kwargs):
    if len(brackets) != 2:
        raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
    padded = string.replace('{', '{{').replace('}', '}}')
    substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
    formatted = substituted.format(*args, **kwargs)
    return formatted

>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'

নোট করুন যে এটি হয় বন্ধনী 2 দৈর্ঘ্যের একটি স্ট্রিং বা দুটি স্ট্রিং (বহু-চরিত্রের সীমানার জন্য) এর পুনরাবৃত্তিযোগ্য হিসাবে কাজ করবে।


সে সম্পর্কেও ভেবেছিলাম। অবশ্যই, এটি খুব কার্যকর হবে এবং অ্যালগরিদম আরও সহজ। তবে, ধারণা করুন আপনার কাছে এরকম অনেকগুলি পাঠ্য রয়েছে এবং আপনি এটি এখানে এবং সেখানে প্যারামিটারাইজ করতে চান। আপনি যখনই ইনপুট স্ট্রিংটি তৈরি করেন আপনি সেই সমস্ত ধনুর্বন্ধনী ম্যানুয়ালি প্রতিস্থাপন করতে চাইবেন না। আপনি আপনার পরামিতিগুলি এখানে এবং সেখানে 'ড্রপ' করতে চান। এই ক্ষেত্রে, আমি মনে করি এই পদ্ধতিটি ব্যবহারকারীর দৃষ্টিকোণ থেকে চিন্তা করা এবং এটি সম্পাদন করা উভয়ই সহজ। আমি লিনাক্সের 'সেড' কমান্ড দ্বারা অনুপ্রাণিত হয়েছি যা সুবিধাজনকভাবে তার উপর ভিত্তি করে আপনার ডিলিমিটারটি নির্বিচারে বেছে নেওয়ার অনুরূপ ক্ষমতা রাখে।
tvt173

সংক্ষেপে, আমি ইউটিলিটি ফাংশনটি প্রতিবার ব্যবহার করার জন্য @ in এ ব্যথা হওয়ার চেয়ে কিছুটা জটিল হতে চাই। আমি যদি আপনার প্রস্তাবটিকে ভুল বুঝি তবে দয়া করে আমাকে জানান।
tvt173

আমি এগিয়ে গিয়ে আমার পাবলিক.ল্যাব স্পেস github.com/dreftymac/public.lab/blob/master/topic/python/…
dreftymac

3

আমি সম্প্রতি এটিতে ছুটে এসেছি, কারণ আমি স্ট্রিমগুলি প্রিম্পম্পটেড জেএসএনে ইনজেক্ট করতে চেয়েছিলাম। আমার সমাধানটি হ'ল একটি সহায়ক পদ্ধতি তৈরি করা ছিল:

def preformat(msg):
    """ allow {{key}} to be used for formatting in text
    that already uses curly braces.  First switch this into
    something else, replace curlies with double curlies, and then
    switch back to regular braces
    """
    msg = msg.replace('{{', '<<<').replace('}}', '>>>')
    msg = msg.replace('{', '{{').replace('}', '}}')
    msg = msg.replace('<<<', '{').replace('>>>', '}')
    return msg

তারপরে আপনি এর মতো কিছু করতে পারেন:

formatted = preformat("""
    {
        "foo": "{{bar}}"
    }""").format(bar="gas")

পারফরম্যান্স কোনও সমস্যা না হলে কাজটি সম্পন্ন করে।


খুব সামান্য পরিবর্তন প্রয়োজন সহ বিদ্যমান কোডে সংহত করার জন্য সহজ এবং মার্জিত। ধন্যবাদ!
কলাম01

2

আপনার যদি স্ট্রিংয়ে দুটি কোঁকড়া ধনুর্বন্ধনী রাখা দরকার হয় তবে আপনার ভেরিয়েবলের প্রতিটি দিকে 5 টি কোঁকড়া ধনুর্বন্ধনী প্রয়োজন।

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'

যারা এফ-স্ট্রিং ব্যবহার করছেন তাদের পক্ষে 5 এর পরিবর্তে উভয় পাশে 4 টি কোঁকড়া ধনুর্বন্ধনী ব্যবহার করুন
টেরিএ

0

কারণটি হল, আপনার ক্ষেত্রে {}সিনট্যাক্সটি কি এটির স্বীকৃতি দেয় না তাই এটি একটি ত্রুটি ছুঁড়েছে।.format().format(){Hello}

আপনি এটি ডাবল কোঁকড়া ধনুর্বন্ধনী using {}} ব্যবহার করে ওভাররাইড করতে পারেন,

x = " {{ Hello }} {0} "

অথবা

%sপাঠ্য বিন্যাসের জন্য চেষ্টা করুন,

x = " { Hello } %s"
print x%(42)  

0

আমি পাঠ্য মুদ্রণের চেষ্টা করার সময় এই সমস্যাটিতে হোঁচট খেয়েছি, যা আমি একটি লেটেক্স ডকুমেন্টে পেস্ট অনুলিপি করতে পারি। আমি এই উত্তরটি প্রসারিত করি এবং নামকরণ প্রতিস্থাপন ক্ষেত্রগুলি ব্যবহার করি:

আপনাকে বলুন যে আপনি সূচকগুলি সহ বহুবিধ ভেরিয়েবলের একটি পণ্য মুদ্রণ করতে চান এখানে চিত্র বর্ণনা লিখুন, যা লেটেক্সে হবে $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$ নিম্নোক্ত কোডটি নামযুক্ত ক্ষেত্রগুলির সাথে কাজ করে যাতে অনেক সূচকের জন্য এটি পাঠযোগ্য হয়:

idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))

-1

আপনি যদি কেবল একটি কোঁকড়ানো ধনুর্বন্ধনী মুদ্রণ করতে চান (উদাহরণস্বরূপ {) আপনি ব্যবহার করতে পারেন {{এবং আপনি যদি চান তবে পরে স্ট্রিংয়ে আরও ধনুর্বন্ধনী যুক্ত করতে পারেন। উদাহরণ স্বরূপ:

>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'

-1

আপনি যখন কোড স্ট্রিংগুলি কেবল ইন্টারপোলেট করার চেষ্টা করছেন তখন আমি জিনজা 2 ব্যবহার করার পরামর্শ দেব যা পাইথনের সম্পূর্ণ বৈশিষ্ট্যযুক্ত টেম্পলেট ইঞ্জিন, যেমন:

from jinja2 import Template

foo = Template('''
#include <stdio.h>

void main() {
    printf("hello universe number {{number}}");
}
''')

for i in range(2):
    print(foo.render(number=i))

সুতরাং অন্যান্য উত্তরগুলির পুরো গুচ্ছের পরামর্শ অনুসারে আপনি কোঁকড়ানো ধনুর্বন্ধনীগুলি নকল করতে বাধ্য হবেন না


-3

আপনি স্ট্রিংয়ের আগে উদ্ধৃতি ছাড়াই কেবল অক্ষর 'আর' যুক্ত করে কাঁচা স্ট্রিং পদ্ধতি ব্যবহার করে এটি করতে পারেন।

# to print '{I am inside braces}'
print(r'{I am inside braces}')

হ্যালো! আপনি এটি আবার যাচাই করতে চাইতে পারেন; পাইথন 3.7 প্রিন্ট \{I am inside braces\}
টিওডর

1
@ টিউটর এর জন্য দুঃখিত এখন আমি কাঁচা স্ট্রিং হিসাবে মুদ্রণ দ্বারা এটি স্থির।
হর্ষ আগরওয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.