2014-02-10 3 views
0

Я пытаюсь превратить данные .csv в словарь в Python, но я, кажется, получаю дубликаты словарных статей..csv данные в словаре в Python: повторяющиеся значения

Это пример того, что данные .csv выглядит следующим образом:

ticker,1,2,3,4,5,6 
XOM,10,15,17,11,13,20 
AAPL,12,11,12,13,11,22 

Мое намерение состоит в том, чтобы использовать первый столбец в качестве ключа, а остальные столбцы как значения. В идеале у меня должно быть 3 записи: тикер, XOM и AAPL. Но вместо этого я получаю это:

{'ticker': ['1', '2', '3', '4', '5', '6']} 
{'ticker': ['1', '2', '3', '4', '5', '6']} 
{'XOM': ['10', '15', '17', '11', '13', '20']} 
{'ticker': ['1', '2', '3', '4', '5', '6']} 
{'XOM': ['10', '15', '17', '11', '13', '20']} 
{'AAPL': ['12', '11', '12', '13', '11', '22']} 

Так это выглядит, как я получаю строку 1, затем грести 1 & 2, то строка 1, 2 & 3.

Это код, я использую :

def data_pull(): 
    #gets data out of a .csv file 
    datafile = open("C:\sample.csv") 
    data = [] #blank list 
    dict = {} #blank dictionary 
    for row in datafile: 
      data.append(row.strip().split(",")) #removes whitespace and commas 
      for x in data: #organizes data from list into dictionary 
       k = x[0] 
       v = x[1:] 
       dict = {k:v for x in data} 
       print dict 

data_pull() 

Я пытаюсь выяснить, почему появляются повторяющиеся записи.

+0

почему это ваш второй цикл внутри первого?Просто не делайте этого, и это будет отлично работать – njzk2

+0

Похоже, что это источник проблемы. Изменение отступов полностью зафиксировало его. Благодаря! – Logic9

ответ

2

У вас слишком много циклов; Вы расширяете data затем цикл по всему data список со всеми записями собрались до сих пор:

for row in datafile: 
    data.append(row.strip().split(",")) #removes whitespace and commas 
    for x in data: 
     # will loop over all entries parsed so far 

так что вы хотите добавить строку в data, затем цикл по списку, с одним элементом:

data = [['ticker', '1', '2', '3', '4', '5', '6']] 

тогда вы бы прочитать следующую строку и добавить к data, так, то вы перебираем data снова и процесс:

data = [ 
    ['ticker', '1', '2', '3', '4', '5', '6'], 
    ['XOM', '10', '15', '17', '11', '13', '20'], 
] 

так итерацию дважды, затем добавьте следующую строку, цикл три раза, и т.д.

Вы могли бы упростить это:

for row in datafile: 
    x = row.strip().split(",") 
    dict[x[0]] = x[1:] 

Вы можете сэкономить некоторую работу, используя csv module:

import csv 

def data_pull(): 
    results = {} 

    with open("C:\sample.csv", 'rb') as datafile: 
     reader = csv.reader(datafile) 
     for row in reader: 
      results[row[0]] = row[1:] 

    return results 
0

цикл for x in data должен быть вне цикла for row in datafile:

for row in datafile: 
    data.append(row.strip().split(",")) #removes whitespace and commas 
for x in data: #organizes data from list into dictionary 
    k = x[0] 

Или csv модуль может быть вашим другом:

with open("text.csv") as lines: 
    print {row[0]: row[1:] for row in csv.reader(lines)} 

Примечание стороны. Это всегда хорошая идея, чтобы использовать сырые строки для путей Windows:

open(r"C:\sample.csv") 

Если файл был назван, например, C:\text.csv тогда \t будет интерпретироваться как tab характер.

0

С помощью встроенного в csv модуля:

import csv 

output = {} 

with open("C:\sample.csv") as f: 
    freader = csv.reader(f) 
    for row in freader: 
     output[row[0]] = row[1:] 
Смежные вопросы