Как прочитать число из файла и отобразить среднее значение в Python - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь преобразовать строку в число с плавающей точкой. Я вытаскиваю текст из файла. Любая помощь или советы будут приняты. Я новичок ie по кодированию. Заранее спасибо.

def main():


    name =["","","","","",""]
    lname = ["","","","","",""]
    grade = [0,0,0,0,0]
    #total = 0
    #count = len(name)
    #average = total / count
   # for i in range(len(grade)):
     #   total += grade[i]

    #Intro
    print("Grades Processing App!\n")

    infile = open("gradestest.txt", "r")

    for n in range(5):
        line = infile.readline()

        #split data into 3 fields
        name[n], lname[n], grade[n] = line.split(",")
        grade[n] = float(grade[n])



    #infile.close()

    #Display data on screen
    print("Name\t\t\tGrade")
    print("--------------------")
    for i in range(5):
        print(name[i], "\t", lname[i], "\t", grade[i])
    print('\n')

    infile.close()
    #for n in range(len(grade)):

        #total += grade[n]
       # count +1
      #  print(average)

    print('Enter the following student information')
    FirstName = input("\tFirst name: ")
    LastName = input("\tLast name: ")
    Grade = float(input("\tTest grade : "))


    infile = open("gradestest.txt", "a")

    infile.write(name + "," + lname + "," + float(grade) + "\n")

    infile.close()

main()

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Проблема в вашем коде, вы не можете записать значения с плавающей точкой в ​​файл. Вы можете записать только строковое значение, вы можете преобразовать его в число с плавающей точкой при чтении файла.

def main():

    print("Grades Processing App!\n")
    with open('test.txt') as fp:
        data = [line.strip().split(",") for line in fp]

    #Display data on screen
    print("Name\t\t\tGrade")
    print("--------------------")
    for name, lname, grade in data:
        print(name, "\t", lname, "\t", grade)

    grades_avg = sum([float(val[2]) for val in data])/len(data)
    print("\nAverage:", grades_avg)

    print('\nEnter the following student information')
    fname = input("\tFirst name: ")
    lname = input("\tLast name: ")
    grade = input("\tTest grade : ")


    with open("test.txt", "a") as fp:
        fp.write(fname + "," + lname + "," + grade + "\n")


main()
0 голосов
/ 24 апреля 2020

Я знаю, что это намного больше, чем вы просили, но так как я оставил несколько длинных советов в комментариях, я добавил их сюда с примерами.

Подсказка о файлах: вы можете использовать with open('myfile.txt', 'r') as infile: и поместите код, который использует файл в этом блоке под ним. Как только выполнение кода покидает этот блок, файл надежно закрывается - даже в случае возникновения исключения.

Чтобы ответить на вопрос в вашем посте, преобразовать текст в значение типа float или int довольно просто. , Единственная проблема заключается в том, что строковые данные не в формате, который можно преобразовать в int или float. Обработка исключений, приведенная ниже, сделает вашу программу более надежной, и она не взорвется при неудачном преобразовании. Но смотреть на то, что у вас было в коде, должно работать.

    with open('gradestest.txt', 'r') as infile:
        for line_no, line in enumerate(infile):
            try:
                name, lname, grade = line.split(',')
                grade = float(grade)
             except ValueError as ve:
                 print(f"Warning, file format incorrect on line "
                       f"{line_no + 1}: {ve}")

Я добавил некоторую отказоустойчивость в l oop, который читает в классах. Когда .split() не выдает нужное количество элементов или float() не удается при попытке преобразовать ненумерованную строку c, возникает ValueError. Блок except перехватывает ValueError и выводит предупреждение о формате файла, но l oop может продолжать пытаться обработать остальную часть файла.

Вместо того, чтобы иметь списки данных, которые опирайтесь на индекс, чтобы связать разные данные с одним и тем же учеником, создайте класс Student, в котором есть члены-данные для имени и класса. Таким образом, вы можете перебирать список учеников, а не перебирать ряд индексов.

class Student:
    def __init__(self, name, lname, grade=None):
        self.name  = name
        self.lname = lname
        self.grade = grade

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

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

    student_list = []

    with open('gradestest.txt', 'r') as infile:
        for line_no, line in enumerate(infile):
            try:
                name, lname, grade = line.split(',')
                grade = float(grade)
                student_list.append( Student(name, lname, grade) )

             except ValueError as ve:
                 print(f"Warning, file format incorrect on line "
                       f"{line_no + 1}: {ve}")

Затем в программе, когда мы хотим перечислить студентов и их оценки:

    print(f"{'name':<20} Grade") # Pads 'name' to 20 characters with spaces.

    for st in student_list:
        print(f"{st.name+' '+st.lname:<20} {st.grade}")

Я использую f-строки для форматирования текста. Текст между фигурными скобками интерпретируется как код Python и возвращает строки в тех местах строки, где они находятся. :<20 выравнивает по левому краю и дополняет текст пробелами.

Последнее предложение. Это может быть немного сложнее, предположим, что вы ведете учетные записи учеников и хотите сохранить информацию в файл, а затем вернуться к своей программе позже и загрузить объекты учеников обратно со всей их информацией. используйте для этого модуль pickle (хотя вы также можете рассмотреть простую базу данных - модуль sqlite довольно хорош)

Pandas также является хорошим вариантом, если вы работаете с табулированные данные об учениках - он может сохранять свои кадры данных в файл и извлекать их довольно легко.

В любом случае, вот что выглядит следующим образом:

    import pickle
    ...
        # Somewhere in your code...
        save_file_y_n = input("Do you want to save student data? ")

        if save_file_y_n.lower() in ['y', 'yes']:
            file_name = input("Name of file: ")

            # Write the Students out to a file.
            pickle.dump(student_list, open(file_name, 'wb+'))
     ...
        # Somewhere else in your code - or another script/program..
        if load_file_y_n.lower() in ['y', 'yes']:
            file_name = input("File name for student records: ")

            # Reconstructs the Student objects from the file data
            # with their name, lname, grades and any other attributes 
            # you may have added:
            student_list = pickle.load(open(file_name, 'rb'))

            print("List of students:")

            for st in student_list:
                print(f"st.name")

Всегда хорошая идея сделать резервную копию ваших данных регулярно в случае, если файл данных ученика каким-либо образом поврежден или случайно удален. Вы даже можете внедрить некоторый код в свою программу, чтобы каждый день сохранять данные учеников в новом файле и загружать последние данные при запуске программы.

Небольшая информация об этом на случай, если вам интересно, и вы уже не перегружены https://wiki.python.org/moin/UsingPickle

Другим вариантом сохранения информации о приложении является модуль json. Он может записывать базовые c объекты данных в файл, используя обычный текст. https://docs.python.org/3/library/json.html

И, конечно, вы можете использовать CSV (значения, разделенные запятыми) - для этого есть модуль csv, https://docs.python.org/3/library/csv.html?highlight=csv#module -csv .

0 голосов
/ 24 апреля 2020

Хммм ... так что я думаю, что есть что обсудить.

1) Сначала отметим, что в python вам не нужно выделять память для ваших объектов. Следовательно, объявление размера и содержания ваших переменных не является необходимым. Python - это Dynami c, поэтому для начала списка можно просто сказать «x = []». а затем "x.append (7)", чтобы добавить 7 в список. Если вы используете i python (настоятельно рекомендуется), вы можете поэкспериментировать с переменными на лету и посмотреть, что они делают. Например, х. (Нажмите вкладку) покажет вам все «методы», доступные для списков.

2) В python имеется множество функций, которые упрощают выполнение повторяющихся задач. Например, метод соединения для строк вставляет любую строку между последовательностью строк, которую вы предоставляете. Другой пример - open () автоматически закрывает файлы, если переменная больше не используется, поэтому в python вы обычно можете открывать, читать и закрывать файл в одну строку.

3) Python сильно вращается вокруг итераторов, которые позволяют упростить многие задачи. К ним относятся встроенные функции, такие как отсортированные, перевернутые, карта, фильтр, диапазон и т. Д. c. Настоятельно рекомендуется ознакомиться с ними, поскольку они значительно улучшат ваш код.

Позволяет немного упростить ваш код:

# Read all lines at once. No need to say 'r', that is the default. 
# The file closes automatically when the variable falls out of scope. 

lines = open('gradestest.txt').readlines()

# Split each line. You can do it all at once in a list comprehension. 

lines = [line.split(',') for line in lines]

# Leaves all the entries alone but the last one. Python can access backwards. 
# The line[:-1] means to access everything but the last item as a list. 
# The line[-1]  means to access the last item (which is grade). 

lines = [line[:-1]+[float(line[-1])] for line in lines]

# There are other ways to read your file as well (probably faster). 
# Python has a huge library of modules, like the csv module which is for 
# opening and reading csv files. 

# The join method inserts strings between other strings. The map function
# takes each item in an object and applies the given function to them. Hence,
# map(str,line) turned all the items into a string (including the item you 
# made a float earlier. 

print("Grades Processing App!\n")
print("Name\t\t\tGrade") 
print("--------------------") 
print('\n'.join('\t'.join(map(str,line)) for line in lines))

# Not quite sure what this code was for. You don't use your variables 
# anywhere. Also you run float(grade) which I think will error, since
# grade is a list. Anyway, I think you meant to append to the file
# some new inputs. 

print('Enter the following student information')
FirstName =       input("\tFirst name: ") 
LastName  =       input("\tLast name:  ") 
Grade     = float(input("\tTest grade: ")) 
open('gradestest.txt','a').write(','.join([FirstName,LastName,Grade])+'\n')

Не думаю, что я ответил на исходный вопрос. Если вы хотите найти среднее значение в python, есть две встроенные команды len () и sum (), которые подсчитывают количество элементов в списке и складывают элементы в списке. Например,

grades  = [1,2,3,4,5]
average = sum(grades)/len(grades)
...