2011-05-04 13 views
5
estoy

generar archivos de entrada formateados específicamente para un programa, y ​​el uso de una pequeña interfaz gráfica pitón tkinter para hacerlo. El código anterior hizo uso de declaraciones de formato fortran. A menos que ya haya un conjunto de funciones de conversión directa para python (que no he encontrado), calculé que el formateo de Python haría el trabajo. En general, se puede, pero no puedo encontrar una manera de tener la repetición de un determinado valor:Python3.2 str.format valor de repetición

Por ejemplo, en FORTRAN:

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

Sé que podría textualmente tener 12 artículos en mi formato de llamada (por ejemplo: ...{0:5d}, {1:5d}, {2:5d}....), pero me preguntaba si hay una forma de tener una forma simplificada como el anterior ejemplo fortran.

¿Hay algo que había perdido, o es que esto no sea posible y tengo que escribir explícitamente cada artículo en el formato?

-Cheers, Chris.

edición Aquí es un ejemplo más claro de lo que estoy haciendo actualmente:

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

Me gustaría ser capaz de

>>> ---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))  

Respuesta

4

Como sugirió ninjagecko, desea construir su cadena de formato en piezas.

El uso de numeración campo implícito como lo he hecho ayuda a simplificar esto, aunque no es estrictamente necesario (numeración explícita sólo se pone un poco más detallado asegurándose de que los números se alinean). Mezclar el formato de cadenas de estilo antiguo y nuevo también significa que podemos omitir algunos tediosos escapes de caracteres especiales.

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

Brillante. No creo conocer la sintaxis% de python realmente, y esto aclara las cosas muy bien, gracias chicos. – Ponml

+0

Puede agradecer a Raymond Hettinger por presentarme ese truco en particular. La sintaxis% -formatting es en realidad formato "antiguo" (Python 2.x) que se mantuvo para 3.x porque eliminarlo era una pesadilla de compatibilidad hacia atrás, pero resulta útil para casos como este. – ncoghlan

2

Se podría generar parte de su cadena de formato como tal (adaptarse lo mejor le parezca):

>>> ','.join(['%s']*5) 
'%s,%s,%s,%s,%s' 

>>> ','.join(['%i']*5) % (1,2,3,4,5) 
'1,2,3,4,5' 

o incluso como '%i '*10 (más concisa, si no le importa un valor separador extra al final)

edición: lo anterior está en desuso, y el cartel original desea un ejemplo explícito, asi que aquí hay un ejemplo explícito con str.format (http://docs.python.org/library/stdtypes.html#str.format) usando el formato especificado en http://docs.python.org/library/string.html#formatstrings. Tenga en cuenta que puede hacer cosas mucho más complicadas que esta demostración, como usar buenos argumentos de palabras clave o incluso atributos de objetos. Ver documentos.

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

resultado:

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

(Edit2: Con perdón de ncoghlan; No vi su nueva respuesta antes de actualizar)

+0

Gracias por la respuesta rápida, pero no estoy muy seguro de cómo encajaría eso con lo que tengo. Edité mi publicación para mostrar lo que estoy haciendo actualmente. – Ponml

+0

answer updated =) – ninjagecko

+0

Excelente, gracias por la respuesta también. – Ponml