web-dev-qa-db-fra.com

Création d'un dictionnaire à partir d'un fichier CSV

Je suis en train d'essayer d'écrire un script python qui prendra les entrées d'un fichier CSV, puis de le transférer dans un format de dictionnaire (j'utilise Python 3.x).

J'utilise le code ci-dessous pour lire dans le fichier CSV et cela fonctionne:

import csv

reader = csv.reader(open('C:\\Users\\Chris\\Desktop\\test.csv'), delimiter=',', quotechar='|')

for row in reader:
    print(', '.join(row))

Mais maintenant, je veux placer les résultats dans un dictionnaire. Je voudrais que la première ligne du fichier CSV soit utilisée comme champ "clé" du dictionnaire, les lignes suivantes du fichier CSV complétant la partie donnée.

Exemple de données:

     Date        First Name     Last Name     Score
12/28/2012 15:15        John          Smith        20
12/29/2012 15:15        Alex          Jones        38
12/30/2012 15:15      Michael       Carpenter      25

Il y a d'autres choses que j'aimerais faire avec ce code, mais pour le moment, il est essentiel que le dictionnaire fonctionne.

Est-ce que quelqu'un peut m'aider avec ça?

Édité Version 2:

import csv
reader = csv.DictReader(open('C:\\Users\\Chris\\Desktop\\test.csv'))

result = {}

for row in reader:
    for column, value in row.items():
        result.setdefault(column, []).append(value)
        print('Column -> ', column, '\nValue -> ', value)
print(result)

fieldnames = result.keys()

csvwriter = csv.DictWriter(open('C:\\Users\\Chris\\Desktop\\test_out.csv', 'w'), delimiter=',', fieldnames=result.keys())

csvwriter.writerow(dict((fn,fn) for fn in fieldnames))

for row in result.items():
    print('Values -> ', row)
    #csvwriter.writerow(row)

'''
Test output

'''
test_array = []
test_array.append({'fruit': 'Apple', 'quantity': 5, 'color': 'red'});
test_array.append({'fruit': 'pear', 'quantity': 8, 'color': 'green'});
test_array.append({'fruit': 'banana', 'quantity': 3, 'color': 'yellow'});
test_array.append({'fruit': 'orange', 'quantity': 11, 'color': 'orange'});
fieldnames = ['fruit', 'quantity', 'color']
test_file = open('C:\\Users\\Chris\\Desktop\\test_out.csv','w')
csvwriter = csv.DictWriter(test_file, delimiter=',', fieldnames=fieldnames)
csvwriter.writerow(dict((fn,fn) for fn in fieldnames))
for row in test_array:
    print(row)
    csvwriter.writerow(row)
test_file.close()
14
gakar06

Créez un dictionnaire, puis parcourez le résultat et remplissez les lignes du dictionnaire. Notez que si vous rencontrez une ligne avec une date en double, vous devrez décider quoi faire (déclencher une exception, remplacer la ligne précédente, ignorer la dernière, etc.)

Voici test.csv:

Date,Foo,Bar
123,456,789
abc,def,ghi

et le programme correspondant:

import csv
reader = csv.reader(open('test.csv'))

result = {}
for row in reader:
    key = row[0]
    if key in result:
        # implement your duplicate row handling here
        pass
    result[key] = row[1:]
print result

rendements:

{'Date': ['Foo', 'Bar'], '123': ['456', '789'], 'abc': ['def', 'ghi']}

ou, avec DictReader:

import csv
reader = csv.DictReader(open('test.csv'))

result = {}
for row in reader:
    key = row.pop('Date')
    if key in result:
        # implement your duplicate row handling here
        pass
    result[key] = row
print result

résulte en:

{'123': {'Foo': '456', 'Bar': '789'}, 'abc': {'Foo': 'def', 'Bar': 'ghi'}}

Ou peut-être souhaitez-vous mapper les en-têtes de colonne sur une liste de valeurs pour cette colonne:

import csv
reader = csv.DictReader(open('test.csv'))

result = {}
for row in reader:
    for column, value in row.iteritems():
        result.setdefault(column, []).append(value)
print result

Cela donne:

{'Date': ['123', 'abc'], 'Foo': ['456', 'def'], 'Bar': ['789', 'ghi']}
54
Phil Frost

Vous avez besoin d'un Python DictReader class. Plus d'aide peut être trouvée à partir de ici

import csv

with open('file_name.csv', 'rt') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print row
10
Aamir Adnan

L'aide de @ phil-frost a été très utile, c'était exactement ce que je cherchais. 

J'ai fait quelques ajustements après cela donc je voudrais le partager ici: 

def csv_as_dict(file, ref_header, delimiter=None):

    import csv
    if not delimiter:
        delimiter = ';'
    reader = csv.DictReader(open(file), delimiter=delimiter)
    result = {}
    for row in reader:
        print(row)
        key = row.pop(ref_header)
        if key in result:
            # implement your duplicate row handling here
            pass
        result[key] = row
    return result

Vous pouvez l'appeler:

myvar = csv_as_dict(csv_file, 'ref_column')

Où ref_colum sera votre clé principale pour chaque ligne. 

Avez-vous envisagé d'utiliser Apache Solr ? Il prend en charge le scoring de la recherche et consomme facilement les données de fichiers CSV. Vous découvrirez qu'il évolue de manière impressionnante et qu'il comporte de nombreuses autres options pour analyser vos données, par exemple la prise en charge de plusieurs langues ou de requêtes mal orthographiées.

Exemples

0
Mark O'Connor