Python: espacie uniformemente los datos de salida con diferentes longitudes de cadena

Estoy intentando que mis datos de salida se vean así:

------------------------------------------------------- Grade Report for Programs ------------------------------------------------------- Jacobson, Mark 19.0 <--- 20,17,20 Snurd, Mortimur 16.5 <--- 20,19,18,17,16,15,14,13 Luxemburg, Rosa 15.0 <--- 18,15,20,10,12 Atanasoff, John 20.0 <--- 20,20,20,20,20,20,20 Hopper, Grace 20.0 <--- 20,20,20,20,20,20 ------------------------------------------------------- 

Pero no sé cómo tratar con la longitud variable del nombre. Mi salida actualmente se ve así.


  Grade Report for Programs ------------------------------------------------------- Jacobson, Mark 19.0 <--- 20,17,20 Snurd, Mortimur 16.5 <--- 20,19,18,17,16,15,14,13 Luxemburg, Rosa 15.0 <--- 18,15,20,10,12 Atanasoff, John 20.0 <--- 20,20,20,20,20,20,20 Hopper, Grace 20.0 <--- 20,20,20,20,20,20 ------------------------------------------------------- 

El progtwig que he escrito es tomar un archivo de entrada de calificaciones de calificaciones y recostackr los datos e imprimir cuidadosamente el promedio.

El archivo de entrada se ve algo como esto:

 Mark Jacobson,20,17,20 Mortimur Snurd,20,19,18,17,16,15,14,13 Rosa Luxemburg,18,15,20,10,12 John Atanasoff,20,20,20,20,20,20,20 Grace Hopper,20,20,20,20,20,20 

Y aquí está mi código que recostack el nombre y los puntajes, e imprime los datos con apellido, nombre, puntaje promedio, y luego los puntajes reales que resultaron del promedio.

 file = input("Enter filename: ") grade_file = open(file, 'r') print() print('---------------------------------------------------------') print('\t\tGrade Report for Programs') print('---------------------------------------------------------') for text in grade_file: end_of_name = text.find(',') name_seperated = text.find(' ') first_name = text[0:name_seperated] last_name = text[name_seperated+1:end_of_name] name_last_first = last_name + "," + " " + first_name grades = text[end_of_name+1:] start = 0 index = 0 sum_n = 0 average= 0 score = 0 count = 0 while index < len(grades): if grades[index] == ',': score = int(grades[start:index]) count += 1 sum_n = score + sum_n start = index + 1 index += 1 count += 1 score = int(grades[start:index]) sum_n = score + sum_n average = sum_n / count print(name_last_first, " ", average, "<---", grades) print('---------------------------------------------------------') grade_file.close() 

Solo necesito averiguar cómo tener espacios pares para hacer una fila y columna uniformes como la primera salida. La ayuda es muy apreciada! ¡Gracias!

Me resulta más sencillo usar el formato de estilo C incorporado de Python:

 >>> print("%-30s %4.1f" % ("Jacobson, Mark", 19.0)) Jacobson, Mark 19.0 >>> 

Tenga en cuenta que un ancho de campo negativo indica que el campo debe justificarse a la izquierda.

Utilice el formato de cadena con especificadores de ancho de campo:

 print('{:20s} {:4.1f} <--- {}'.format(name_last_first, average, grades)) 

Esto utiliza el método str.format() con la syntax de cadena de formato para asignar valores a una plantilla.

La primera ranura formatea las cadenas en un campo de 20 caracteres de ancho, la segunda ranura en números de punto flotante en un campo de 4 caracteres de ancho, utilizando 1 dígito después del punto decimal (dejando 1 para el punto decimal más 2 dígitos antes del punto).

Si yo fuera usted, también miraría el módulo csv para leer sus datos, en lugar de utilizar manipulaciones de cadenas. Obtendrá objetos de lista con valores separados para cada columna:

 import csv print('---------------------------------------------------------') print('\t\tGrade Report for Programs') print('---------------------------------------------------------') with open(file, 'r', newline='') as grade_file: reader = csv.reader(grade_file) for row in reader: name = row[0] name = ' '.join(map(str.strip, reversed(name.split(','))) grades = [int(g) for g in row[1:]) average = sum(grades) / len(grades) print('{:20s} {:4.1f} <--- {}'.format(name, average, ','.join(grades))) print('---------------------------------------------------------') 

La respuesta que encuentro más fácil es simplemente usar una aritmética de cadena básica.

Por ejemplo, supongamos que desea alinear una variable 20 espacios delante de la alineación a la izquierda, en su caso, la variable “promedio”, simplemente podría hacer esto

 print(name_last_first + (' ' * (20-len(name_last_first))) + average + "<----" + grades) 

Es un poco más largo, pero el código es más fácil de interpretar en mi opinión.

(Nota: este método solo funciona con fonts mono espaciadas. Pero la mayoría de la salida de Python está predeterminada para una fuente MS :-))