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