it-swarm.com.de

Erstellen eines Wörterbuchs aus einer CSV-Datei

Ich versuche gerade, ein Python-Skript zu schreiben, das die Eingabe aus einer CSV-Datei übernimmt und dann in ein Wörterbuchformat überträgt (ich verwende Python 3.x).

Ich verwende den folgenden Code, um die CSV-Datei einzulesen, und das funktioniert:

import csv

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

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

Nun möchte ich die Ergebnisse in ein Wörterbuch einfügen. Ich möchte, dass die erste Zeile der CSV-Datei als "Schlüsselfeld" für das Wörterbuch verwendet wird, wobei die nachfolgenden Zeilen in der CSV-Datei den Datenteil ausfüllen.

Beispieldaten:

     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

Es gibt weitere Dinge, die ich mit diesem Code gerne machen würde, aber für jetzt suche ich nur, dass das Wörterbuch funktioniert.

Kann mir jemand dabei helfen?

EDITED 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

Erstellen Sie ein Wörterbuch, iterieren Sie anschließend das Ergebnis und füllen Sie die Zeilen im Wörterbuch. Wenn Sie auf eine Zeile mit einem doppelten Datum stoßen, müssen Sie entscheiden, was zu tun ist (eine Ausnahme auslösen, die vorherige Zeile ersetzen, die spätere Zeile verwerfen usw.).

Hier ist test.csv:

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

und das entsprechende Programm:

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

ergibt:

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

oder mit 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

ergebnisse in:

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

Oder Sie möchten die Spaltenüberschriften einer Liste von Werten für diese Spalte zuordnen:

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

Das ergibt:

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

Sie benötigen eine Python DictReader - Klasse. Weitere Hilfe finden Sie unter hier

import csv

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

Hilfe von @ phil-frost war sehr hilfreich, genau das war es, wonach ich gesucht hatte. 

Ich habe danach ein paar Verbesserungen vorgenommen, also möchte ich es hier teilen: 

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

Sie können es nennen:

myvar = csv_as_dict(csv_file, 'ref_column')

Dabei ist ref_colum der Hauptschlüssel für jede Zeile. 

Haben Sie überlegt, Apache Solr zu verwenden? Es unterstützt das Scoring von Suchergebnissen und verbraucht leicht CSV-Dateidaten. Sie werden feststellen, dass die Skalierung beeindruckend ist, und Sie haben viele andere Optionen zur Analyse Ihrer Daten, z. B. Unterstützung für mehrere Sprachen oder falsch geschriebene Abfragen.

Beispiele

0
Mark O'Connor