2016-03-08 5 views
2

Написать функцию, которая принимает имя файла (строка) в CSV-файл, который содержит информацию об именах студента и их оценках четыре курса и возвращает словарь данных. Ключом словарем должно быть имя учащегося, а значения должны быть списком чисел с плавающей запятой их классов. Для Например, если содержимое файла выглядит следующим образом:Python: содержимое файла словарь

Mark,90,93,60,90 
Abigail,84,50,72,75 
Frank,46,83,53,79 
Yohaan,47,77,74,96 

тогда ваша функция должна возвращать словарь, такие как:

out_dict = {'Frank': [46.0, 83.0, 53.0, 79.0], 
      'Mark': [90.0, 93.0, 60.0, 90.0], 
      'Yohaan': [47.0, 77.0, 74.0, 96.0], 
      'Abigail': [84.0, 50.0, 72.0, 75.0]} 

Это мой код:

def dict_from_file (file_name): 
    file_pointer = open(file_name, 'r') 
    data = file_pointer.readlines() 
    print (data) 
    output_dict = {} 
    for line in data: 

    file_pointer.close() 
    return (output_dict) 

#Main Program 
file_name = input("Enter the exact file name with its extension (.i.e., .txt): ") 
result = dict_from_file (file_name) 
print (result) 

Как вы можете видеть st в цикле for отсутствуют. Проблема в том, что я не могу найти какую-либо логику, чтобы сначала взять ввод из файла и вставить его в словарь. И если я планирую извлечь каждую строку один раз, как я могу добавить ее в словарь с именем в качестве ключа и четырьмя цифрами в качестве значений?

ответ

5

Чтобы строго сосредоточиться на коде:

Если вы печатаете, что вы читаете, вы заметите, у вас есть это:

['Mark,90,93,60,90\n', 'Abigail,84,50,72,75\n', 'Frank,46,83,53,79\n', 'Yohaan,47,77,74,96'] 

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

Таким образом, вы в значительной степени ищет:

l = line.split(',') 
output_dict[l[0]] = map(float, l[1:]) 

Что происходит там, что вы принимаете каждую деталь вы итерацию, что делает его список, разделив на «». Затем вы возьмете первый элемент в списке и сделаете это своим ключом. Затем, чтобы присвоить свое значение, вы должны использовать метод map, который отобразит каждый элемент в вашем list в поплавок.

Вы будете делать эту операцию для каждого считываемого line.

Таким образом, в конце концов, вы будете иметь:

def dict_from_file (file_name): 
    file_pointer = open(file_name, 'r') 
    data = file_pointer.readlines() 
    print (data) 
    output_dict = {} 
    for line in data: 
     l = line.split(',') 
     output_dict[l[0]] = map(float, l[1:]) 
    file_pointer.close() 
    return output_dict 

#Main Program 
result = dict_from_file ('stuff.txt') 
print (result) 

Запуск этого кода, даст вам:

{'Frank': [46.0, 83.0, 53.0, 79.0], 'Yohaan': [47.0, 77.0, 74.0, 96.0], 'Abigail': [84.0, 50.0, 72.0, 75.0], 'Mark': [90.0, 93.0, 60.0, 90.0]} 
+0

Я предлагаю сочетание этого ответа (несколько столбцов) и srowland's, в котором используется считыватель CSV. Это решение не удастся для совершенно правильной строки CSV, например: «Smith, John», 10,10,10,10 – brianpck

+0

@brianpck Достаточно честный. Решение было составлено вместе с учетом структуры данных, которая была предоставлена. OP может использовать то, что они хотят от решений. :) – idjaw

+0

На самом деле я просто изучаю python, поэтому мне нужно познакомиться со встроенными функциями и их использованием. Большое спасибо за решение, хотя. –

2

Я предлагаю вам использовать Csv читателя:

import csv 
with open(file_name, 'rb') as csvfile: 
    csv_reader = csv.reader(csvfile) 
    for row in csv_reader: 
     output_dict[row[0]] = [float(n) for n in row[1:]] 

Нечто подобное должно работать, если правильно вставлен в ваш цикл. Я не тестировал код, но он не должен быть слишком далеко.

+0

Да, _should_ работы. Но вы можете сделать его более общим, поэтому он может обрабатывать любое количество баллов, а не жестко кодировать его для 4 значений. –

+0

Справедливая точка, спасибо, могла бы взять отличную карту из ответа @ idjaw и использовать что-то вроде output_dict [row [0]] = map (float, row [1:]) – srowland

+1

[Не использовать 'map'] (http: //www.artima.com/weblogs/viewpost.jsp?thread=98196), хотя! – brianpck

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