exportieren von Daten in csv-von mongodb mithilfe von python
Ich habe Probleme mit export in csv, indem Sie mit einem python-Skript. einige array-Daten müssen exportiert werden, um CSV-von Mongodb, aber das folgende Skript nicht exportieren richtig, weil drei Unterfeld Daten ausgegeben werden, die in eine Spalte. Ich möchte drei separate Felder(Reihenfolge, text,answerid) unter dem Antworten-Feld in drei verschiedenen Spalten in einer CSV-Datei.
dem Beispiel von Mongodb:
"answers": [
{
"order": 0,
"text": {
"en": "Yes"
},
"answerId": "527d65de7563dd0fb98fa28c"
},
{
"order": 1,
"text": {
"en": "No"
},
"answerId": "527d65de7563dd0fb98fa28b"
}
]
python-Skript:
import csv
cursor = db.questions.find ({},{'_id':1, 'answers.order':1, 'answers.text':1, 'answers.answerId':1})
cursor = list(cursor)
with open('answer_2.csv', 'w') as outfile:
fields = ['_id','answers.order', 'answers.text', 'answers.answerid']
write = csv.DictWriter(outfile, fieldnames=fields)
write.writeheader()
for x in cursor:
for y, v in x.iteritems():
if y == 'answers'
print (y, v)
write.writerow(v)
write.writerow(x)
- Konnte Sie Bearbeiten Ihre Frage zeigen einen korrekt formatierten code? Auch würde es helfen, wenn Sie Hinzugefügt einige Beispiel, wie die Daten, die Sie immer von Mongo aussieht.
- bitte helfen Sie mir.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So... Das problem ist, dass die
csv
Verfasser nicht verstehen, das Konzept der "subdictionaries" als "mongo" gibt es.Wenn ich das richtig verstanden, wenn Sie die Abfrage Mongo, erhalten Sie ein Wörterbuch wie dieses:
So, wenn die
csv.DictWriter
versucht, dass zu schreiben, es ist nur schreiben, ein Wörterbuch (die oberste). Er weiß nicht (oder kümmert sich darum), dassanswers
ist eine Liste, die enthält Wörterbücher, deren Werte geschrieben werden müssen in den Spalten als auch (Zugriff auf Felder in Wörterbüchern mit Hilfe der Punkt-notation wieanswers.order
wird nur verstanden von Mongo, nicht von der csv writer)Was ich verstehe, dass Sie tun sollten, ist der "walk" - die Liste der Antworten und erstellen Sie ein Wörterbuch aus der jeder Datensatz (jede Wörterbuch) in dieser Liste. Sobald Sie eine Liste von "abgeflacht" Wörterbücher übergeben Sie diese und schreiben Sie Sie in Ihr
csv
Datei:Whatch für die Verwendung von Pluralformen.
answers_record
ist anders alsanswer_record
Erstellt eine Datei wie diese:
EDIT:
Ihre Anfrage (die eine, die macht
cursor = db.questions.find ({},{'_id':1, 'answers.order':1, 'answers.text':1, 'answers.answerId':1})
) werden wieder alle Einträge in derquestions
Sammlung. Wenn diese Sammlung ist sehr groß, Sie möchten möglicherweise verwenden Sie dascursor
als iterator.Vielleicht haben Sie es schon gemerkt, die ersten
for
- Schleife in meinem code oben setzt alle Datensätze in einer Liste (flattened_records
Liste). Sie können tun, lazy loading durch Durchlaufen dercursor
(statt laden alle Einzelteile im Speicher zu Holen, etwas tun, kommt der nächste, etwas damit zu tun...).Es ist etwas langsamer, aber mehr Speicher effizient.
Wird es produzieren die gleichen
.csv
- Datei wie oben gezeigt.