it-swarm.com.de

Wie konvertiere ich diese Liste der Wörterbücher in eine CSV-Datei?

Ich habe eine Liste von Wörterbüchern, die ungefähr so ​​aussieht:

toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]

Was muss ich tun, um dies in eine csv-Datei umzuwandeln, die ungefähr so ​​aussieht:

name,age,weight
bob,25,200
jim,31,180
103
Backus
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

BEARBEITEN: Meine bisherige Lösung behandelt die Bestellung nicht. Wie von Wilduck angemerkt, ist DictWriter hier besser geeignet.

195

In Python csv module gibt es einen DictWriter , der wahrscheinlich hilfreich sein wird.

19
Wilduck

dies ist, wenn Sie eine Wörterbuchliste haben:

import csv
with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
11
hamed

Da @User und @BiXiC bei UTF-8 nach Hilfe gefragt haben, hier eine Variation der Lösung von @Matthew. (Ich darf nicht kommentieren, also antworte ich.)

import unicodecsv as csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)
5
flowerflower

In Python 3 sind die Dinge ein bisschen anders, aber viel einfacher und weniger fehleranfällig. Es ist eine gute Idee, der CSV mitzuteilen, dass Ihre Datei mit utf8-Codierung geöffnet werden sollte, da sie die Daten für andere portierbar macht (vorausgesetzt, Sie verwenden keine restriktivere Codierung wie latin1)

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
with open('people.csv', 'w', encoding='utf8', newline='') as output_file:
    fc = csv.DictWriter(output_file, 
                        fieldnames=toCSV[0].keys(),

                       )
    fc.writeheader()
    fc.writerows(toCSV)
  • Beachten Sie, dass csv in Python 3 den Parameter newline='' benötigt, andernfalls erhalten Sie beim Öffnen in Excel/opencalc leere Zeilen in Ihrer CSV.

Alternativ: Ich bevorzuge die Verwendung des csv-Handlers im Modul pandas. Ich finde, es ist toleranter für Codierungsprobleme und pandas konvertiert beim Laden der Datei automatisch String-Nummern in CSVs in den richtigen Typ (int, float usw.). 

import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)

Hinweis:

  • pandas kümmern sich darum, die Datei für Sie zu öffnen, wenn Sie einen Pfad angeben, und standardmäßig utf8 in python3 sowie Kopfzeilen.
  • ein Datenrahmen hat nicht dieselbe Struktur wie CSV, so dass Sie beim Laden eine Zeile hinzufügen, um dasselbe zu erhalten: dataframe.to_dict('records')
  • pandas erleichtern auch die Kontrolle der Reihenfolge der Spalten in Ihrer CSV-Datei. Standardmäßig sind sie alphabetisch, Sie können jedoch die Spaltenreihenfolge angeben. Mit dem Vanilla csv-Modul müssen Sie ihm eine OrderedDict zuführen, oder sie werden in einer zufälligen Reihenfolge angezeigt (wenn in Python <3.5 gearbeitet wird). Siehe: Spaltenreihenfolge in Python Pandas DataFrame beibehalten für mehr.
1
Marc Maxmeister

Hier eine andere, allgemeinere Lösung, vorausgesetzt, Sie haben keine Liste von Zeilen (möglicherweise passen sie nicht in den Speicher) oder eine Kopie der Header (möglicherweise ist die write_csv-Funktion generisch):

def gen_rows():
    yield OrderedDict(name='bob', age=25, weight=200)
    yield OrderedDict(name='jim', age=31, weight=180)

def write_csv():
    it = genrows()
    first_row = it.next()  # __next__ in py3
    with open("people.csv", "w") as outfile:
        wr = csv.DictWriter(outfile, fieldnames=list(first_row))
        wr.writeheader()
        wr.writerow(first_row)
        wr.writerows(it)

Hinweis : Der hier verwendete OrderedDict-Konstruktor behält nur die Reihenfolge in Python bei> 3.4. Wenn die Reihenfolge wichtig ist, verwenden Sie das Formular OrderedDict([('name', 'bob'),('age',25)]).

0
eddygeek
import csv

with open('file_name.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(('colum1', 'colum2', 'colum3'))
    for key, value in dictionary.items():
        writer.writerow([key, value[0], value[1]])

Dies wäre der einfachste Weg, Daten in die Datei .csv zu schreiben

0
jitesh mohite