2014-02-03 2 views
0

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

visitid CDate CTIME

OMHioJh8XEeq7152 6/15/2007 06:00

OMHioJh8XEeq7152 6/14/2007 07:10

OMHioJh8XEeq7152 6/11/2007 14:21

t2v0TjgroLTI6118 4/28/2006 14: 18

t2v0TjgroLTI6118 5/1/2006 04:00

В частности, с учетом такого рода список, я хочу, чтобы сделать ключ в словаре, равным значению первого столбца, а для значения не имеют остальные столбцы в виде списка. Наконец, я хочу добавить значение в другой список, если есть дубликаты значения в столбце 1, чтобы сформировать список списков, так сказать. Это то, что я до сих пор, после выполнения некоторых исследований здесь и в других местах:

def test_results(filename): 
import csv 
with open(filename,"rU") as f: 
    reader = csv.reader(f,delimiter="\t") 
    result = {} 
    for row in reader: 
     key = row[0] 
     if key in result: 
      result[row[0]].append(row[1]) 
     else: 
      result[row[0]] = key 
     result[key]=row[1:] 
    print result 

Это работает, но это не добавляет ценности, чтобы сделать список списков, а только добавляет к словарю последней строки для любого уникального посещенияID.

Спасибо!

+0

вы уверены, что вы не получаете n ошибка относительно объектов str, не имеющих метода добавления? – geoffspear

+0

Сначала у меня была ошибка, но после того, как я изменил несколько вещей, по какой-то причине это больше не дает мне этой ошибки. – MimiMoraine

ответ

1

Вы должны использовать defaultdict:

from collections import defaultdict 
import csv 

def test_results(filename): 
    with open(filename, "rU") as f: 
     reader = csv.reader(f, delimiter="\t") 
     result = defaultdict(list) 
     # Skip header row 
     next(reader) 
     for row in reader: 
      result[row[0]].append(row[1:]) 

defaultdict(list) будет считать, пустой список, если ключ не присутствует в словаре. С учетом ввода обеспечить в этом вопросе, result будет содержать:

{'OMHioJh8XEeq7152': [['6/15/2007', '06:00'], 
         ['6/14/2007', '07:10'], 
         ['6/11/2007', '14:21']], 
't2v0TjgroLTI6118': [['4/28/2006', '14:18'], 
         ['5/1/2006', '04:00']]} 

Если вы хотите более гибкий формат, необходимо преобразовать даты и времени строки в datetime объекта с помощью dateutil.parser.parse:

import csv 
from collections import defaultdict 
from dateutil import parser 


def test_results(filename): 
    with open(filename, "rU") as f: 
     reader = csv.reader(f, delimiter="\t") 
     result = defaultdict(list) 
     # Skip header line 
     next(reader) 
     for row in reader: 
      result[row[0]].append(parser.parse(' '.join(row[1:]))) 

Какие выходы:

{'OMHioJh8XEeq7152': [datetime.datetime(2007, 6, 15, 6, 0), 
         datetime.datetime(2007, 6, 14, 7, 10), 
         datetime.datetime(2007, 6, 11, 14, 21)], 
't2v0TjgroLTI6118': [datetime.datetime(2006, 4, 28, 14, 18), 
         datetime.datetime(2006, 5, 1, 4, 0)]} 
+0

Мне очень нравится ваше решение, но когда я использую его в файле, с которым я работаю, он дает мне словарь списков, который я но он делает это много раз (т. е. 10+ дубликатов словарей, содержащих одно и то же). Вы не знаете, почему это может быть? – MimiMoraine

+0

Несомненно. Я новичок в stackoverflow, хотя - где можно загрузить файл? – MimiMoraine

+0

http://pastebin.com/MJSanQ56 – MimiMoraine

1

Может быть что-то вроде этого:

if key in result: 
     result[row[0]].append(row[1:]) 
    else: 
     result[row[0]] = key 
     result[key] = [row[1:]] 
+0

Это очень близко, я думаю - он дает мне полную длину первой строки, но дает мне только дату других строк. Спасибо за помощь! – MimiMoraine

+0

ах! Я починил это. Вторая строка выше должна быть .append (строка [1:]) с двоеточием. Пожалуйста, примите в качестве ответа, если он будет работать! – Isaac

+0

Вы можете удалить 'result [row [0]] = key', это не имеет никакого смысла.Поскольку 'key = row [0]', вы действительно говорите «result [key] = key' –

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