2011-05-04 18 views
5

Bir program için özel olarak oluşturulmuş giriş dosyaları oluşturuyorum ve bunu yapmak için küçük bir python çizgi işareti kullanın. Eski kod, fortran formatı ifadelerinden yararlandı. Python'un (henüz bulamadığım) işlevleri için doğrudan bir dönüşüm kümesi olmadıkça, python'un biçimlendirmesinin işi yapacağını düşünmüştüm. Fortranda ÖrneğinPython3.2 Str.format değeri tekrarı

: it can Genel olarak, ama belli bir değerin tekrarını için bir yol bulamıyorum

FORMAT (2A1, I3, **12I5**, F8.3, A7). The "12I5" statement translates to 12 integer values of width 5. 

ben metin olarak benim biçim çağrısında 12 ürün olabilir biliyorum (örneğin: ...{0:5d}, {1:5d}, {2:5d}....), ama yukarıdaki fortran örneği gibi basitleştirilmiş bir forma sahip olmanın bir yolu olup olmadığını merak ediyordum.

Kaçırdığım bir şey var mı, yoksa bu mümkün değil ve formattaki her öğeyi açıkça yazmalı mıyım?

-Cheers, Chris. İşte düzenlemek

Şu anda ne yapıyorum daha açık bir örneğidir:

>>> ---tester = ["M", "T", 1111, 2222, 234.23456, "testing"]  
>>> ---fmt = "{0:1}{1:1}, {2:3d}, {3:5d}, {4:8.3F}, {5:>7}"  
>>> ---print(fmt.format(*tester))  
MT, 13, 1234, 234.235, testing 

Ben

>>> ---tester = ["M", "T", 1111, **2222, 3333, 4444**, 234.23456, "testing"]  
>>> ---fmt = "{0:1}{1:1}, {2:3d}, **3*{3:5d}**, {4:8.3F}, {5:>7}"  
>>> ---print(fmt.format(*tester))  

cevap

4

adettir.

Yaptığım gibi örtülü alan numaralandırmayı kullanmak, bunu basitleştirmeye yardımcı olur, ancak kesinlikle gerekli olmamasına rağmen (açık numaralandırma, rakamların sıralı olduğundan emin olmak için biraz daha ayrıntılı hale gelir). Eski ve yeni stil dizesi biçimlendirmesini karıştırmak, özel karakterlerin sıkıcı bir şekilde kaçmasını da engelleyebileceğimiz anlamına gelir.

subfmt = ", ".join(["{:5d}"]*3) 
fmt = "{:1}{:1}, {:3d}, %s, {:8.3F}, {:>7}" % subfmt 
tester = ["M", "T", 1111, 2222, 3333, 4444, 234.23456, "testing"] 

>>> print(fmt) 
{:1}{:1}, {:3d}, {:5d}, {:5d}, {:5d}, {:8.3F}, {:>7} 
>>> print(fmt.format(*tester)) 
MT, 1111, 2222, 3333, 4444, 234.235, testing 
+0

Parlak. Python için% sözdizimini gerçekten bildiğimi sanmıyorum ve bu da işleri güzelce temizliyor, teşekkürler çocuklar. – Ponml

+0

Bana bu hile tanıtımı için Raymond Hettinger'e teşekkür edebilirsin. % -formatting sözdizimi aslında "eski stil" (Python 2.x) biçimlendirmesidir. Bu, 3.x için saklanmıştı, çünkü onu kaldırmak, geriye dönük uyumluluk kabusuydu, ancak bu gibi durumlar için kullanışlı olduğu ortaya çıkıyor. – ncoghlan

2

Sen kısmını oluşturabilir edebilmek istiyorum senin format dizgesi (uygun gördüğünüz şekilde uyarlayın):

hatta '%i '*10 gibi düzenlemek

(eğer sonunda fazladan bir ayırıcı değerini sakıncası yoksa daha kısa ve öz,): Yukarıdaki kalkmıştır ve özgün afiş açık bir örneğini istiyoruz, bu yüzden burada http://docs.python.org/library/string.html#formatstrings'da belirtilen biçimi kullanarak str.format (http://docs.python.org/library/stdtypes.html#str.format) ile açık bir örnek. Bu demodan çok daha karmaşık şeyler yapabileceğinizi unutmayın, örneğin güzel anahtar kelime argümanları veya nesne öznitelikleri kullanma gibi. Dokümanlara bakın.

tester = ["M", "T", 1111, 2222, 3333, 4444, 234.23456, "testing"] 
fmt = "{}{}, {:3d}, " + 3*"{:5d}, " + "{:8.3F}, {:>7}" 
fmt.format(*tester) 

sonucu:

'MT, 1111, 2222, 3333, 4444, 234.235, testing' 

(edit2: özür ncoghlan için birlikte; ben güncellemeden önce onun yeni bir cevap görmedim) ninjagecko önerilen olarak daki biçim dizesi inşa etmek isteyen,

+0

Hızlı yanıt için teşekkürler, ancak bunun sahip olduğum şeye ne kadar uyduğunu bilmiyorum. Şu anda ne yaptığımı göstermek için yayınımı düzenledim. – Ponml

+0

yanıt güncellendi =) – ninjagecko

+0

Mükemmel, cevap için de teşekkürler. – Ponml

İlgili konular