Проблемы форматирования нового файла в 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')
так как вам никогда не нужно имя с включенным символом перевода строки, вы можете удалить его сразу же.