2016-03-23 3 views
0

Проблема проста: у меня есть файл CSV с четырьмя столбцами, который я хотел бы оценить в первом столбце, и сделать это в словаре в моем сценарии python. Я не хочу добавлять значения в словарные даты завершенных задач.Как создать динамические словари в Python с использованием CSV-файла

Данные CSV для этого можно найти в файле с именем VC.csv, например этого:

24M Technologies,Series A,8/19/10 
24M Technologies,Grant,8/16/10 
2B Energy,Private Equity,3/18/14 
2B Energy,Series B,3/18/14 
2B Energy,Unattributed VC,5/1/08 
3GSolar Photovoltaics,Series A,12/17/12 
3sun Group,Growth Equity,3/3/14 
3Tier Group,Series C,11/17/08 

Конечный результат я хотел бы иметь словари, которые, как это, когда я распечатать их.

Например

>>> print 3TierGroup 
>>> 
>>>{'company': '2B Energy', 'Private Equity': '3/18/14', 'Series B': '3/18/14', 'Unattributed VC': '05/01/08'} 

Где моя проблема пытается петлевым корыто и добавить больше к уже определенному словарю. Вместо добавления я предполагаю, что я воссоздаю и переписываю цикл каждый проход. В результате я получаю {'company': '2B Energy', 'Private Equity': '3/18/14'} Мне нужна последняя строка моего кода, чтобы проверить, присутствует ли словарь уже; если это так, он добавит к нему дополнительные круглые даты.

Вот мой код ...

import csv 

companyList =[] 
transactionDates=[] 
dictNames=[] 

def fileNameCleaner(namer): 
    namer = namer.replace(' ', '') 
    namer = namer.replace(',','') 
    namer = namer.replace('-','') 
    namer = namer.replace('.','') 
    namer = namer.replace('_','') 
    namer = namer.replace('@','') 
    namer = namer.replace('&','') 
    return namer 

with open('VC.csv', 'rb') as rawData: 
    timelineData = csv.reader(rawData, delimiter=',', quotechar='"')  # Open CSV file and snag data 
    for line in timelineData: # Run through each row in csv 
     companyList.append(fileNameCleaner(line[0])) # Create list and remove some special charcters 
    companyList = list(set(companyList)) # Remove duplicates and Sort 

for companyListRow in companyList: 
    with open('VC.csv', 'rb') as rawDataTwo: 
     timelineDataTwo = csv.reader(rawDataTwo, delimiter=',', quotechar='"') 
     for TList in timelineDataTwo: 
      company = TList[0] 
      finRound = TList[1] 
      tranDate = TList[2] 
      if companyListRow == fileNameCleaner(TList[0]): 
       companyListRow = {'company':TList[0], finRound:tranDate } 
       print companyListRow 
+0

Я думаю, что такие данные будут лучше всего представлены и запрошены в базе данных SQL (думаю, SQLite), так как типы финансирования (seriesA, seriesB и т. Д.) Будут повторяться часто и использовать много ненужного хранилища. Кроме того, чтобы запросить данные, выяснив, какое финансирование, в какой последовательности лучше всего будет использоваться в базе данных SQL (одна таблица для компаний, одна для типов финансирования, одна для дат с иностранными ключами, являющимися компанией и типом финансирования). – roadrunner66

ответ

0

Чтение в ваших данных:

str1='''24M Technologies,Series A,8/19/10 
24M Technologies,Grant,8/16/10 
2B Energy,Private Equity,3/18/14 
2B Energy,Series B,3/18/14 
2B Energy,Unattributed VC,5/1/08 
3GSolar Photovoltaics,Series A,12/17/12 
3sun Group,Growth Equity,3/3/14 
3Tier Group,Series C,11/17/08''' 

list1= str1.split('\n') 
print list1 

Я думаю, что вам нужен только один словарь (не так много), чтобы вы могли искать данные по названию компании, например как это:

comps={} 
for abc in list1: 
    a,b,c=abc.split(',') 
    if not a in comps: 
     comps[a]= [[b,c]] 
    else: 
     comps[a].append([b,c]) 

for k,v in comps.iteritems(): 
    print k,v 

Выход:

3sun Group [['Growth Equity', '3/3/14']] 
2B Energy [['Private Equity', '3/18/14'], ['Series B', '3/18/14'], ['Unattributed VC', '5/1/08']] 
3Tier Group [['Series C', '11/17/08']] 
3GSolar Photovoltaics [['Series A', '12/17/12']] 
24M Technologies [['Series A', '8/19/10'], ['Grant', '8/16/10']] 

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

0

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

# define dict (to be keyed by company name) to accumulate company attributes from CSV file 
company_data = {} 

with open('VC.csv', 'rb') as rawData: 
    # Open CSV file and snag data 
    timelineData = csv.DictReader(rawData, delimiter=',', quotechar='"', 
            fieldnames=['company','key','value']) 

    # Run through each row in csv 
    for line in timelineData: 
     name = filenameCleaner(line['company']) 
     # get record for previously seen company, or get a new one with just the name in it 
     rec = company_data.get(name, {'company': name}) 

     # add this line's key-value to the rec for this company 
     rec[line['key']] = line['value'] 

     # stuff updated rec back into the overall summarizing dict 
     company_data[name] = rec 

# now get the assembled records by getting just the values from the summarizing dict 
company_recs = company_data.values() 
Смежные вопросы