प्रारूप उत्पादन स्ट्रिंग, सही संरेखण


149

मैं एक पाठ फ़ाइल को संसाधित कर रहा हूं जिसमें x, y, z निर्देशांक हैं

     1      128  1298039
123388        0        2
....

हर पंक्ति का उपयोग करके 3 आइटम में सीमांकित किया गया है

words = line.split()

डेटा को संसाधित करने के बाद मुझे एक और txt फ़ाइल में निर्देशांक लिखने की आवश्यकता है ताकि प्रत्येक कॉलम में आइटम सही संरेखित हों (साथ ही इनपुट फ़ाइल)। हर पंक्ति निर्देशांक से बना है

line_new = words[0]  + '  ' + words[1]  + '  ' words[2].

क्या std::setw()सी ++ में कोई मैनिपुलेटर जैसी चौड़ाई और संरेखण सेट करने की अनुमति है?

जवाबों:


230

नए str.formatसिंटैक्स का उपयोग करके इस दृष्टिकोण की कोशिश करें :

line_new = '{:>12}  {:>12}  {:>12}'.format(word[0], word[1], word[2])

और यहाँ पुराने %सिंटैक्स का उपयोग करके इसे कैसे करें (पायथन के पुराने संस्करणों के लिए उपयोगी है जो समर्थन नहीं करते हैं str.format):

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])

39
ध्यान दें कि "पुराना" सिंटैक्स क्लीनर है, पढ़ने में आसान है, और छोटा है।
fyngyrz

2
मैंने सोचा था कि मैं प्रदान किए गए एक से अधिक प्रत्यक्ष लिंक जोड़ूंगा
brw59

48
निश्चित रूप से, मुझे नहीं पता कि क्लीनर का वास्तव में क्या मतलब है, लेकिन 'पढ़ने में आसान' सिर्फ इसलिए है क्योंकि यह परिचित है, मुझे लगता है। यदि आप उनमें से किसी एक से पहले से परिचित नहीं हैं, तो नया प्रारूप पढ़ने में आसान लगता है। स्ट्रिंग प्रारूपण के लिए ".format" निश्चित रूप से प्रतिशत / मोडुलो की तुलना में अधिक सहज लगता है। दाएं संरेखण के लिए सही तीर बहुत सहज लगता है।
मार्क

2
@ मर्क एक तरीका पुराना है क्लीनर यह है कि यह कम पात्रों का उपयोग करता है। हाँ परिचित के साथ नया तरीका सहज हो जाता है लेकिन यह क्लीनर और सरल नहीं है। पुराना तरीका उन लोगों के लिए अधिक सहज है जो वाक्यविन्यास के आदी हैं जो आदरणीय सी भाषा, अनुकरणीय सहमति और सटीक भाषा के माध्यम से हमारे पास आते हैं। नए तरीके के लिए क्या मिसाल है?
स्टीफन बोस्टन

2
@StephenBoston मैं विशेषज्ञों के लिए पठनीयता छोड़ दूंगा, लेकिन नया तरीका बिल्कुल साफ है। Parens अब वैकल्पिक नहीं हैं। % एक गणित ऑपरेटर के साथ भ्रमित हो सकता है (यद्यपि, संदर्भ में संभावना नहीं है, लेकिन एक नज़र में निश्चित है)। पुराना तरीका विफल हो जाएगा यदि शब्द [n] अपेक्षित प्रकार का नहीं है (इस मामले में स्ट्रिंग)। नए तरीके से यह जानने की जरूरत नहीं है कि आने वाला प्रकार क्या है, यह हमेशा काम करता है। साफ और सरल। निष्पक्ष होने के लिए, मैं कभी भी प्रिंटफ स्टाइल के साथ सहज नहीं हुआ (मैंने ज्यादातर सी के साथ कॉउट किया)।
ज़िम

53

इसका उपयोग करके प्राप्त किया जा सकता है rjust:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)

51

आप इसे इस तरह से संरेखित कर सकते हैं:

print('{:>8} {:>8} {:>8}'.format(*words))

जहां >का अर्थ है " सही करने के लिए संरेखित " और 8है चौड़ाई विशिष्ट मूल्य के लिए।

और यहाँ एक प्रमाण है:

>>> for line in [[1, 128, 1298039], [123388, 0, 2]]:
    print('{:>8} {:>8} {:>8}'.format(*line))


       1      128  1298039
  123388        0        2

Ps। *lineइसका मतलब है कि lineसूची को अनपैक किया जाएगा, इसलिए .format(*line)इसी तरह काम करता है .format(line[0], line[1], line[2])(मानकर lineकेवल तीन तत्वों के साथ एक सूची है)।



18

यहाँ एक और तरीका है कि आप 'f-string' प्रारूप का उपयोग कैसे कर सकते हैं:

print(
    f"{'Trades:':<15}{cnt:>10}",
    f"\n{'Wins:':<15}{wins:>10}",
    f"\n{'Losses:':<15}{losses:>10}",
    f"\n{'Breakeven:':<15}{evens:>10}",
    f"\n{'Win/Loss Ratio:':<15}{win_r:>10}",
    f"\n{'Mean Win:':<15}{mean_w:>10}",
    f"\n{'Mean Loss:':<15}{mean_l:>10}",
    f"\n{'Mean:':<15}{mean_trd:>10}",
    f"\n{'Std Dev:':<15}{sd:>10}",
    f"\n{'Max Loss:':<15}{max_l:>10}",
    f"\n{'Max Win:':<15}{max_w:>10}",
    f"\n{'Sharpe Ratio:':<15}{sharpe_r:>10}",
)

यह निम्नलिखित आउटपुट प्रदान करेगा:

Trades:              2304
Wins:                1232
Losses:              1035
Breakeven:             37
Win/Loss Ratio:      1.19
Mean Win:           0.381
Mean Loss:         -0.395
Mean:               0.026
Std Dev:             0.56
Max Loss:          -3.406
Max Win:             4.09
Sharpe Ratio:      0.7395

आप यहां क्या कर रहे हैं, आप कह रहे हैं कि पहला कॉलम 15 वर्ण लंबा है और यह न्यायसंगत है और दूसरा स्तंभ (मान) 10 वर्ण लंबा है और यह सही है।


क्या स्वरूपों की चौड़ाई को समतल करने का एक तरीका है? इस उदाहरण में यदि आप स्वरूपण को 20 और 15 चौड़ाई में बदलने का निर्णय लेते हैं तो इसके लिए कई लाइनों को बदलना होगा। widths = [15, 10] f"{'Trades:':<width[0]}{cnt:>width[1]}",मैं ऊपर की तरह sth हासिल करना चाहता हूँ।
टॉमस सबला

1
समझ गया! शायद किसी को यह मददगार लगेगा। मुझे इसके लिए एक और नेस्टेड ब्रैकेट की आवश्यकता है:f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
टॉमाज़ सबाला

1
कभी-कभी सबसे अच्छे उत्तर वही होते हैं जो सटीक प्रश्न का उत्तर नहीं देते हैं। इसके लिए धन्यवाद! :)
ब्रायन विले

5

आउटपुट का सरल सारणीकरण:

a = 0.3333333
b = 200/3
print("variable a    variable b")
print("%10.2f    %10.2f" % (a, b))

उत्पादन:

variable a    variable b
      0.33         66.67

% 10.2f: 10 न्यूनतम लंबाई है और 2 दशमलव स्थानों की संख्या है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.