2017-09-26 7 views
1

J'ai un fichier CSV de données boursières que je voudrais mettre dans un dictionnaire contenant les dates et prix de clôture.Comment formater une liste de dictionnaires à partir de CSV? - Python

Voici ce que le CSV ressemble à: date close volume open high low 2017/09/22 151.89 46575410 152.02 152.27 150.56 2017/09/21 153.39 37350060 155.8 155.8 152.75 2017/09/20 156.07 52126240 157.9 158.26 153.83 2017/09/19 158.73 20565620 159.51 159.77 158.44

Je voudrais le dictionnaire final à être organisé comme ceci:

perfect_dict = [ 
{'Date': '2017/09/22', 'Close': '151.89'}, 
{'Date': '2017/09/21', 'Close': '153.39'}, 
...] 

Mon code actuel saisit les données CSV et crée deux listes distinctes pour les dates et les prix de clôture. J'ai essayé d'utiliser dict(zip(dates, close_prices) mais cela ne formate pas le nouveau dictionnaire comme je l'ai mentionné ci-dessus. Ceci est mon code:

import csv 
from collections import defaultdict 

# ---> 
columns = defaultdict(list) 

with open('mydata.csv') as f: 
    reader = csv.DictReader(f) 
    for row in reader: value2,...} 
     for (k,v) in row.items(): 
      columns[k].append(v) 

dates = columns['date'] 
close_prices = columns['close'] 

# This is what doesn't format it right 
#stock_dict = dict(zip(dates, close_prices)) 
#pprint.pprint(stock_dict) 

Si quelqu'un pouvait me pointer dans la bonne direction ce serait génial, merci!

+0

J'ai une question. Pourquoi votre fichier de valeurs séparées par des virgules n'est-il pas séparé par des virgules? – HyperNeutrino

+0

Il y a deux choses qui ne vont pas. Vous attendez dictionnaire de dictionnaires en tant que sortie. Cependant, il n'y a pas de clé associée à chaque sous-dictionnaire. Aussi, vous n'avez pas de virgule dans le fichier csv. –

+0

@HyperNeutrino Je vois ce que tu veux dire, lol. Ces données sont simplement copiées dans une feuille de calcul Google, c'est pourquoi – jblew

Répondre

1

En utilisant pandas lire le csv file

  • première lecture de la colonne et de stocker date et close comme une liste
  • que faire une liste de dictionnaire format dont nous avions besoin.

Le code

import pandas as pd 
df = pd.read_csv("file_name.csv") 
# read the date and close column and store as a list. 
time_list = list(df['date']) 
close_list = list(df['close']) 
perfect_dict = [] 
# here take the minimum length 
# because avoiding index error 
take_length = min(len(time_list),len(close_list)) 
for i in range(take_length): 
    temp_dict={} 
    temp_dict["Date"]=time_list[i] 
    temp_dict["Close"] = close_list[i] 
    perfect_dict.append(temp_dict) 
print(perfect_dict) 

L'autre façon possible.

import csv 
perfect_dict=[] 
with open('file.csv') as f: 
    reader = list(csv.reader(f)) 
    for row in reader[1:]: 
     temp_dict = {} 
     temp_dict["Date"] = row[0] 
     temp_dict["Close"] = row[1] 
     perfect_dict.append(temp_dict) 
print(perfect_dict) 
+0

Merci, cela a parfaitement fonctionné! – jblew

3

Vous pouvez utiliser la compréhension dictionnaire:

import csv 

data = list(csv.reader(open('filename.csv'))) 
final_data = [{a:b for a, b in zip(["Date", "Close"], i[:2])} for i in data[1:]] 

Notez que vous ne pouvez pas stocker les dictionnaires dans un ensemble que les dictionnaires sont eux-mêmes unhashable.

+0

Cela ne fonctionne pas; il fait juste une liste de cartes de '" Date "' à cette ligne comme une chaîne. Pas utile pour OP ... ** edit ** Je pense que mon CSV n'était pas séparé par des virgules ... désolé – HyperNeutrino

+0

@HyperNeutrino non, cela devrait fonctionner.L'OP demande que la liste des dictionnaires soit créée avec les clés "Date" et "Fermer", que ce code crée. Cependant, s'il y a une erreur de syntaxe flagrante que je n'ai pas vue s'il vous plaît faites le moi savoir. – Ajax1234

+0

Merci @ Ajax1234 cette méthode fonctionne! – jblew

1

Je ne pense pas que le format que vous visez soit possible - voulez-vous dire que vous voulez une liste de dictionnaires? Comme écrit, ceci est un dictionnaire de dictionnaires mais le dictionnaire externe n'a aucune clef.

De plus, si vous souhaitez définir la valeur d'une donnée clé de dictionnaire, vous voudrez peut-être faire quelque chose comme:

columns[k] = v 

EDIT: ce

Est-ce que se rapprocher de vous cherchez pour? Instanciez les colonnes en tant que liste vide, puis formatez chaque ligne de votre fichier csv en tant que dictionnaire et ajoutez-la à cette liste.

columns = [] 

with open('mydata.csv') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     row_as_dict = {k: v for k, v in row.items()} 
      columns.append(row_as_dict) 
+0

Je pense qu'une liste de dictionnaires serait mieux, oui. Je ne sais pas à quoi cela ressemblerait exactement, mais je veux juste que chaque date et son prix de clôture correspondant soient des entités individuelles qui constituent une liste globale. Est-ce possible? – jblew

+0

Informations complémentaires ajoutées. La sortie devrait maintenant ressembler plus à: list_of_dicts = [ {'Date': '2017/09/22', 'Fermer': '151.89'}, {'Date': '2017/09/21', 'Fermer ':' 153.39 '}, ...] – speedyturkey

+0

J'ai exécuté le code que vous avez ajouté en bas, et il renvoie une erreur: 'columns [k] .append (row_as_dict) NameError: le nom' k 'n'est pas défini' – jblew