Проблемы форматирования нового файла в python

Так что я довольно новичок в python (и вообще программирую), и я мог бы использовать некоторую серьезную помощь, чтобы найти проблему в моем коде. По сути, я открываю файл, который содержит любое количество учеников, которым следуют 4 результата теста. Ну как то так:

John
78.0
80.0
69.0
98.0
Bob
40.0
78.0
77.0
89.0
etc

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

  John: 78.0 80.0 69.0 98.0 Average: 81.25
  Bob: 40.0 78.0 77.0 89.0 Average: 71.0

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

  John,81.25
  Bob, 71.0

Однако моя программа выводит это на экран:

Mary
 :76.0 89.0 82.0 100.0 Average: 86.75
Joey
 :91.0 81.0 83.0 95.0 Average: 87.5
Sally
 :92.0 93.0 90.0 97.0 Average: 93.0

И сохраняет файлы, как это:

  Mary
  86.75Joey
  87.5Sally
  93.0

Кто-нибудь может помочь с любой из этих проблем? Это школьное задание, так что достаточно просто помочь определить мой плохой код.

Вот мой беспорядок кода:

Создать файл, содержащий оценки студентов

scoresa = open('project3-scoresa.txt','w')
scoresa.write("Mary\n76\n89\n82\n100\nJoey\n91\n81\n83\n95\nSally\n92\n93\n90\n97")
scoresa.close()



def main():
    averages = open("averages.csv","w")
    file = input("Please enter the scores filename:")
    try:
        scores = open(file,'r')
        print("File",file,"has been opened")
    except IOError:
        print("File",file,"could not be opened.")
    scores = open(file,'r')
    i = 0
    for line in scores:
        if i%5 == 0:
            name = line
            print(name.strip("/n"),":", end="")
            j = 1
            total = 0
        else:
            score = float(line)
            print(score, end=" ")
            total += score
            ave = total/j
            if j == 4:
                print("Average:",ave)
                Avestring = (name + str(ave))
                averages.write(Avestring)
            j += 1
        i += 1
    scores.close()
    averages.close()
    average = open("averages.csv","r")
    for line in average:
        print(line.strip("\n"))
main()

3 ответа

Вы очень близки Попробуй это.

def main():
    averages = open("averages.csv","w")
    file = input("Please enter the scores filename:")
    try:
        scores = open(file,'r')
        print("File",file,"has been opened")
    except IOError:
        print("File",file,"could not be opened.")
    scores = open(file,'r')
    i = 0
    for line in scores:
        if i%5 == 0:
            name = line.strip("\n")
            print(name,":", end="")
            j = 1
            total = 0
        else:
            score = float(line)
            print(score, end=" ")
            total += score
            ave = total/j
            if j == 4:
                print("Average:",ave)
                Avestring = (name + "," + str(ave) + "\n")
                averages.write(Avestring)
            j += 1
        i += 1
    scores.close()
    averages.close()
    average = open("averages.csv","r")
    for line in average:
        print(line.strip("\n"))
main()

Основные изменения:

name = line.strip("\n") # note the \n not /n
print(name,":", end="")

Avestring = (name + "," + str(ave) + "\n") # note the comma and line break.

Ваша первая проблема может быть решена путем замены "/n" на "\n" в строке № 20:

 print(name.strip("/n"),":", end="")

и это превратится в:

 print(name.strip("\n"),":", end="")

И другие изменения, которые я сделал, были в строке №: 19 и 30 . Сначала я выделил строку для символа новой строки. Новая строка кода будет.

name = line.strip("\n")
Avestring = (name +","+ str(ave)+ "\n")

У вас есть опечатка в этой строке:

print(name.strip("/n"),":", end="")

то есть вы должны иметь \n (escape-последовательность, указывающая символ новой строки), а не /n

Это означает, что символ новой строки не удаляется из имени при печати, вот почему вы выводите это так:

Mary
 :76.0 89.0 82.0 100.0 Average: 86.75

а не это:

Mary:76.0 89.0 82.0 100.0 Average: 86.75

(обратите внимание, вы также должны добавить пробел после : чтобы получить целевой результат)

Обратите внимание, что даже если вы использовали name.strip('\n') (т.е. без опечатки), что вы все равно увидите вторую проблему при записи в файл. призвание strip() на name не меняет значение name сам, поэтому символ новой строки все еще находится в name когда вы делаете:

Avestring = (name + str(ave))
averages.write(Avestring)

Чтобы обновить значение name вы бы сделали:

name = name.split('\n')

который принимает старое значение name, звонки split() на нем и сохраняет возвращенный результат обратно в name,

Однако в этом случае вы можете просто сделать:

name = line.split('\n')

так как вам никогда не нужно имя с включенным символом перевода строки, вы можете удалить его сразу же.

Другие вопросы по тегам