2015-10-24 2 views
1

Я пытаюсь получить мои выходные данные выглядят следующим образом:Python: Равномерно выходные данные пространства с различной длиной строки

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

Но я не знаю, как иметь дело с различной длины имени. В настоящее время мой вывод выглядит следующим образом.


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

Программа я написал взять входной файл баллов классов и собирать данные и аккуратно распечатать в среднем.

Входной файл выглядит примерно так:

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 

И вот мой код, который собирает имя и результаты, и выводит данные с фамилией, именем, средним баллом, то фактическими оценок что привело к среднему.

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

Мне просто нужно выяснить, как иметь даже пробелы, чтобы он делал четный ряд и столбец, как первый выход. Помощь очень ценится! Благодаря!

ответ

1

Использование строки форматирования с шириной поля спецификаторов:

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

Это использует str.format() method с Format String Syntax до значений слотов в шаблон.

Первый слот форматирует строки в поле шириной 20 символов, а второй - с числами с плавающей запятой в поле шириной 4 символа, используя 1 цифру после десятичной точки (оставляя 1 для самой десятичной точки плюс 2 цифры перед точкой).

Если бы я был вами, я бы также посмотрел на csv module, чтобы читать ваши данные, а не использовать строковые манипуляции. Вы получите список объектов с отдельными значениями для каждого столбца:

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('---------------------------------------------------------') 
+0

Спасибо за быструю и хорошо описанную обратную связь! Это сделало именно то, что я хотел! Что касается модуля csv, я обязательно посмотрю на это! Просто это было для присвоения класса и помочь нам понять, что мы рассмотрели в классе, учитель любит, чтобы мы использовали вещи, которые мы уже изучили!Мы также пытались найти способ прочитать наш собственный код csv без использования модуля csv! Но спасибо вам за объяснение! – Alik

2

я считаю, что проще в использовании Питона предопределённые форматирования C-стиль:

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

Обратите внимание, что отрицательная ширина поля указывает на то, что поле должно быть оправдано влево.

+0

Awesome, отлично работает python 2.7 – Jasmeet

0

Ответ, который я нахожу наиболее простым, - это просто использовать некоторую базовую арифметику строки.

Например, скажем, хотят выровненные переменные 20 пробелов перед левым выравниванием, в вашем случае «средний» переменный, вы могли бы просто сделать это

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

Это просто немного более длинным, но на мой взгляд, код легче интерпретировать.

(Примечание: этот метод работает только с моно разнесены шрифтами Но большинство выхода Python по умолчанию настроен на :-) шрифта MS!)

Смежные вопросы