2014-02-06 2 views
0

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

max_points = [25, 25, 50, 25, 100] 
assignments = ['hw ch 1', 'hw ch 2', 'quiz ', 'hw ch 3', 'test'] 
students = {'#Max': max_points} 

def load_records(students, filename): 
    #loads student records from a file 
    in_file = open(filename, "r") 
    #run until break 
    while True: 
     #read line for each iteration 
     in_line = in_file.readline() 
     #ends while True 
     if not in_line: break 
     #deletes line read in 
     in_line = in_line[:-1] 
     #initialize grades list 
     grades = [0]*len(students['#Max']) 
     #set name and grades 
     name, grades[0], grades[1], grades[2], grades[3], grades[4] = in_line.split() 
     #add names and grades to dictionary 
     students[name] = grades 
     print name, students[name] 


filename = 'C:\Python27\Python_prgms\Grades_list.txt' 
print load_records(students, filename) 

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

+1

Вам не нужно прокомментировать каждую строку, особенно если это очевидно. – IanAuld

+0

Как в стороне, эти типы проектов по сохранению являются моим примером № 1 того, как объектно-ориентированное программирование может упростить код. Представьте себе, что вместо этого есть список объектов «Student», каждый из которых имеет переменную «grades» экземпляра, которая представляет собой список объектов «Assignment», каждая из которых имеет переменные экземпляра 'max' и' score'. Эта проблема внезапно становится намного яснее. –

ответ

2

Другой способ сделать это:

def load_records(students, filename): 
    with open(filename) as f: 
     for line in f: 
      line = line.split() 
      name = line[0] 
      students[name] = map(int, line[1:]) 
      print name, students[name] 

Это кажется немного странным, что student словарь содержит как баллы и параметр #Max, хотя - ключ имеет два значения, это имя студента или имя параметра ? Может быть, лучше их разделить.

+0

«#Max» будет эквивалентен учащемуся, который набрал максимум на каждом задании. Причина этого заключается в том, что она будет печататься перед всеми другими учениками при прохождении через клавиши. – errolflynn

+0

Я не понимаю, на какой карте (int, line [1:]). Не могли бы вы объяснить? – errolflynn

+0

Также спасибо. Это работало как шарм. – errolflynn

0

У меня было задание, подобное этому в прошлом году.

def load_records(students, filename): 
    file = open(filename, 'r') 
    s = "" 
    while s != None: # loop until end of file is reached 
     s = file.readline() 
     # manipulate s how you need 

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

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