2014-11-24 2 views
0

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

'song, 2000, 184950' 
'boom, 2009, 83729' 
'boom, 2010, 284500' 
'boom, 2011, 203889' 
'pow, 2000, 385920' 
'pow, 2001, 248930' 

из этого, я должен создать словарь, состоящий из слова как и затем список объектов класса как значение.

Это то, что я до сих пор ...

class Counter(): 
    __slots__ = ('year', 'count') 
    _types = (int, int) 

def readfile(file): 
    d = dict() 
    with open(file) as f: 
     for line in f: 
      element = line.split(,) 
      for word in element: 
       if word in d: 
        d[word].append([Count(int(element[1]), int(element[2]))]) 
       else: 
        d[word] = [Count(int(element[1]), int(element[2]))] 
    print(d) 

выход я получаю это странно, и это дает мне словарь похоже на то, что шахта должна выглядеть, но это с помощью подсчета (183930) в качестве ключа вместо имени. Мне также нужно добавить класс в значение, если оно уже указано в словаре.

например, так как «стрела» уже должна быть в словаре с {'boom' : Count(year = 2009, count = 83729)} Я хочу, чтобы список объектов Count был под одним значением.

ожидается выход:

{'song' : [Count(year= 2000, count= 184950)], 'boom' : [Count(year=2009, count=83729), 
Count(year=2010, count= 284500), Count(year=2011, count=203889)], 'pow' : ...etc..} 
+0

@Martijn вы уверены, что '' 'должен быть в примере csv? Я думаю, что они имели смысл вокруг строки, но не как образец csv. – Vyktor

+0

@Vyktor: ОП использовал это в своей выборке; Я оставлю это им, чтобы удалить его. –

+0

Ваш код недействителен; в нем отсутствуют кавычки (например, вокруг запятой), а класс 'Counter()', как указано, не будет работать. Не могли бы вы дать нам * рабочий код *? –

ответ

0

С помощью этого цикла:

for word in element: 
    if word in d: 
     d[word].append([Count(int(element[1]), int(element[2]))]) 
    else: 
     d[word] = [Count(int(element[1]), int(element[2]))] 

который перебираете корыто все слова на линии, так что вы звоните (для первой строки):

d['song'].append([Count(int('2000'), int('184950'))]) 
d['2000'].append([Count(int('2000'), int('184950'))]) 
d['184950'].append([Count(int('2000'), int('184950'))]) 

Просто используйте:

for line in f: 
    element = line.split(,) 
    word = element[0] 
    if word in d: 
     d[word].append(Count(int(element[1]), int(element[2]))) 
    else: 
     d[word] = [Count(int(element[1]), int(element[2]))] 

Вы также можете заменить условие if word in d если вы используете collections.defaultdict:

import collections 

def readfile(file): 
    d = collections.defaultdict(list) 
    with open(file) as f: 
     for line in f: 
      element = line.split(,) 
      word = element[0] 
      d[word].append(Count(int(element[1]), int(element[2]))) 

    print(d) 
+0

Или вы можете использовать 'd.setdefault (word, []). Append (...)' (с регулярным 'dict', а не' defaultdict'). –

+0

@ Martijn, это хорошо, я не знал об этом ... Но это кажется немного странным для меня (особенно/не в этом случае/если у вас было несколько ветвей в коде, которые могут заполнить словарь, и вам придется копировать значение по умолчанию для каждого места). – Vyktor

+0

Спасибо! это сработало для меня! Defaultdict для меня новый, так что спасибо за то, что вы дали мне альтернативный путь! @Vyktor – kbaumzie

0

Вот некоторые простой код, который делает то, что вы ищете.

from collections import defaultdict 
from pprint import pprint 


class Counter(object): 
    __slots__ = ('year', 'count') 

    def __init__(self, year, count): 
     self.year = year 
     self.count = count 

    def __str__(self): 
     return "Counter(year=%d, count=%d)" % (self.year, self.count) 

    def __repr__(self): 
     return self.__str__() 


def import_counts(): 
    counts = defaultdict(list) 
    with file('data.csv') as f: 
     for line in f: 
      name, year, count = line.split(',') 
      name, year, count = name.strip(), int(year.strip()), int(count.strip()) 
      counts[name].append(Counter(year, count)) 

    return counts 

pprint(import_counts()) 

Однако, я изменил формат данных в соответствующий CSV, как показано ниже.

song, 2000, 184950 
boom, 2009, 83729 
boom, 2010, 284500 
boom, 2011, 203889 
pow, 2000, 385920 
pow, 2001, 248930 

Выход генерируется, как показано ниже:

{ 
    'boom': [ 
     Counter(year=2009, count=83729), 
     Counter(year=2010, count=284500), 
     Counter(year=2011, count=203889) 
    ], 
    'pow': [ 
     Counter(year=2000, count=385920), 
     Counter(year=2001, count=248930) 
    ], 
    'song': [ 
     Counter(year=2000, count=184950) 
    ] 
} 

Обратите внимание, что выше не подтверждает ввод и будет ошибка, если дан неверный CSV.

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