0

Ich habe Python-Skript bekam wie:Wie transformiere Wörterbücher, die Listen enthalten, in bestimmte Zeilen?

for row in file: 
    .... 
    .... 
    .... 
    whole_calendar = {} 
    whole_calendar['ID'] = id 
    whole_calendar['OPEN'] = open_days 
    whole_calendar['CLOSED'] = closed_days 
    whole_calendar['CHECKED'] = checked_days 
    print(whole_calendar) 

, die (iteriert) eine Menge ähnlicher Wörterbuch Zeilen erzeugt:

{'ID': ['133528'], 'OPEN': ['1/1/2016', '2/1/2016', '3/1/2016', '4/1/2016'], 'CLOSED': ['5/1/2016'], 'CHECKED': ['1/7/2016']} 

{'ID': ['176987'], 'OPEN': ['3/6/2016', 4/6/2016'], 'CLOSED': [], 'CHECKED': ['1/7/2016',2/7/2016]} 

{'ID': ['347697'], 'OPEN': ['1/2/2016'], 'CLOSED': ['1/3/2016'], 'CHECKED': []} 

Was ich brauche, ist diese Wörterbücher (Zeilen) in der CSV schreiben Datei in Form dieser Tabelle ->

133528,'OPEN','1/1/2016' 
133528,'OPEN','2/1/2016' 
133528,'OPEN','3/1/2016' 
133528,'OPEN','4/1/2016' 
133528,'CLOSED','5/1/2016' 
133528,'CHECKED','1/7/2016' 
176987,'OPEN','3/6/2016' 
176987,'OPEN','4/6/2016' 
176987,'CHECKED','1/7/2016' 
176987,'CHECKED','2/7/2016' 
347697,'OPEN','1/2/2016' 
347697,'CLOSED','1/3/2016' 

ich nur Einbauten Bibliotheken in Python 2.6 (keine Pandas)

verwenden müssen

Ich habe einige Transformationen versucht + mit csv.writerow, aber ich kann es nicht tun. Können Sie mir bitte hier helfen?

+0

die gewünschte Ausgabe nicht immer in dieser Reihenfolge sein könnte, weil es ein Wörterbuch so ungeordnet ... – Aditya

+0

ist: Zeilen). Ich werde es als CSV von einer anderen Software lesen :-) – Akiz

Antwort

0

Sie verkomplizieren die Dinge mit dem Zwischenwörterbuch Schritt. Sie könnten einfach die neue Datei schreiben, während Sie Zeilen aus der alten Datei lesen.

import csv 

with open('new_format.csv', 'w') as csvfile: 
    fieldnames = ['id', 'status', 'date'] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 

    for row in file: 
     .... 
     .... 
     .... 
     [writer.writerow({'id': id, 'status': 'OPEN', 'date': d}) for d in open_days] 
     [writer.writerow({'id': id, 'status': 'CLOSED', 'date': d}) for d in closed_days] 
     [writer.writerow({'id': id, 'status': 'CHECKED', 'date': d}) for d in checked_days] 
+0

Es gibt nur zwei Dinge, die ich ändern musste. Ich habe die eckigen Klammern um die Ausdrücke gelöscht, und ich habe writer.writerows anstelle von writer.writerow verwendet, weil es geschrieben hat, dass mein Wörterbuch andere Feldnamen als mein Verfasser enthält. Ich verstehe nicht, warum und ich verstehe auch nicht, warum es leere Zeile nach jedem erzeugt, aber es funktioniert jetzt. Vielen Dank! – Akiz

+0

Versuchen Sie mit aktualisierten Code – andrew

+0

Danke, jetzt funktioniert es in der gleichen Weise wie "meine Version" mit write.writerows ... Können Sie mir erklären, wie die eckigen Klammern um die Funktion funktioniert? Ich weiß nicht, wo ich in der Dokumentation nachsehen soll ... – Akiz

0

Andrew Antwort für mich nicht 100% Arbeit, aber nachdem ich habe kleine Änderungen vorgenommen:

import csv 

with open('new_format.csv', 'w') as csvfile: 
    fieldnames = ['id', 'status', 'date'] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 

    for row in file: 
     .... 
     .... 
     .... 
     writer.writerows({'id': id, 'status': 'OPEN', 'date': d} for d in open_days) 
     writer.writerows({'id': id, 'status': 'CLOSED', 'date': d} for d in closed_days) 
     writer.writerows({'id': id, 'status': 'CHECKED', 'date': d} for d in checked_days) 

es tut und es sieht fast richtig (Ich weiß nicht, warum ich leer bekommen Dies ist nicht das Problem

... 
    8: 4882410,CLOSED,2016-11-09 
    9: 
    10: 4882410,CLOSED,2016-11-10 
    11: 
    12: 4882410,CLOSED,2016-11-11 
    ... 
Verwandte Themen