преобразовать список значений из текстового файла в словарь

Итак, у меня есть этот текстовый файл с именем «Students.txt», я хочу определить функцию с именем load (student), поэтому у меня есть этот код:

def load(student):
      body

я не совсем уверен, что написать для тела кода, чтобы он читал файл и возвращал значение из файла в виде словаря. Я знаю, что в любом случае это будет что-то вроде readlines(), файл student.txt выглядит так:

P883, Michael Smith, 1991
L672, Jane Collins, 1992
(added)L322, Randy Green, 1992
H732, Justin Wood, 1995(added)
^key  ^name        ^year of birth 

функция должна вернуть словарь, который выглядит следующим образом:

{'P883': ('Michael Smith',1991),
'(key)':('name','year')}

Мне удалось вернуть значения методом проб и ошибок, однако я не могу создавать новые строки и продолжать возвращать \n.

=============== на этот вопрос был дан ответ, и я использовал следующий код, который отлично работает, однако, когда в значениях из txt-файла есть пробел .. (см. Добавленные части) это больше не работает и выдает ошибку о том, что индекс списка вне допустимого диапазона


person Janezcka    schedule 29.03.2011    source источник
comment
У вас тоже есть проблема с использованием модуля csv? Чем отличаются добавленные данные от исходных? я не вижу никаких...   -  person Felix Kling    schedule 29.03.2011


Ответы (4)


Что-то вроде этого должно сделать это, я думаю:

students = {}

infile = open("students.txt")
for line in infile:
  line = line.strip()
  parts = [p.strip() for p in line.split(",")]
  students[parts[0]] = (parts[1], parts[2])

Это может быть не 100%, но должно дать вам отправную точку. Обработка ошибок была опущена для краткости.

person unwind    schedule 29.03.2011

Похоже на файл CSV. Затем вы можете использовать модуль csv:

import csv
studentReader = csv.reader(open('Students.txt', 'rb'), delimiter=',', skipinitialspace=True)
d = dict()
for row in studentReader:
    d[row[0]] = tuple(row[1:])

Это не даст вам год как целое число, вы должны преобразовать его самостоятельно:

for row in studentReader:
    d[row[0]] = tuple(row[1], int(row[2]))
person Felix Kling    schedule 29.03.2011
comment
+1 за то, что он единственный, кто упомянул CSV. Однако в некоторых случаях вы поместили CVS вместо CSV. - person Stephen Paulger; 29.03.2011
comment
вы можете удалить начальные пробелы через ридер: csv.reader(open('students.txt'), delimiter=',', skipinitialspace=True) - person juanchopanza; 29.03.2011
comment
@juanchopanza: Спасибо :) Я тоже это понял, но я был бы быстрее, если бы прочитал твой комментарий ;) - person Felix Kling; 29.03.2011

Я бы использовал модуль pickle в python, чтобы сохранить ваши данные в виде словаря, чтобы вы мог легко загрузить его, распаковав его. Или вы можете просто сделать:

d = {}
with open('Students.txt', 'r') as f:
  for line in f:
    tmp = line.strip().split(',')
    d[tmp[0]] = tuple(tmp[1],tmp[2])
person TheDude    schedule 29.03.2011

person    schedule
comment
Если вы .split(','), то .strip() каждый элемент для удаления пробелов. - person eumiro; 29.03.2011