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()
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']}
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
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