2016-04-05 3 views
-4

Ich habe Probleme beim Extrahieren von Daten aus einer Liste von Dicts basierend auf der Position in meiner Konfiguration definiert. Szenario: Ich bekomme eine Liste von Dict aus der Vertica-Tabelle (durch einige Methodenaufruf) und ich muss diese Daten (Schlüssel als Header und Wert als Dateninhalt) in die Datei schreiben, so dass ich diese Datei hochladen kann zu einem anderen Zweck sftp.Wie schreibe ich Daten in eine Datei basierend auf der Position in Python

Beispiel

# data received in a list of dict 
new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'}, 
      {'Table':'A', 'Column':'C2', 'DataType':'varchar'}, 
      {'Table': 'B', 'Column': 'C3', 'DataType': 'int'} 
      ] 

Meine Konfiguration so definiert ist, dass „Table“ Daten von 0 bis 10 beginnen werden, „Spalte“ wird von 11 bis 25 beginnt und dann „Datentyp“ wird aus 25 starten 35 in der Datei. Wenn nicht genügend Daten vorhanden sind, um den definierten Bereich zu füllen, müssen Sie mit Leerzeichen nach den Daten arbeiten, bis die angegebene Feldlänge erreicht ist. Also erwarte ich Output wie unten. Hier ist die Liste dynamisch. Ich weiß, ich muss seek() verwenden, aber etwas verwirrt.

Table   Column     DataType 
A    C1      int 
A    C2      varchar 
B    C3      int 

Irgendwelche Vorschläge?

+0

Sich auf Listenindizes zu verlassen, um Ihre Daten zu finden, ist brüchig und verschwenderisch. Ich würde ein anderes Datenformat als Listen verwenden; Was ist mit einem Wörterbuch von Wörterbüchern? Json? Jedenfalls bin ich mir sicher, dass ich die Frage genau verstehe. Wo ist dein Code zum Schreiben von Dateien? – jDo

+0

Meine Empfehlung würde 'struct' Modul verwenden, wäre aber eine lange Antwort –

+0

Öffnen Sie die Datei zum Schreiben und Aktualisieren mit' w + 'Modus. Rufen Sie 'seek()' auf, um zur gewünschten Position zu wechseln, und verwenden Sie 'write()', um die gewünschten Daten zu schreiben. –

Antwort

1

Ich denke, das ist das, was Sie wollen, mit string formatting:

>>> def f(lst): 
     print('{:<10s}{:<15s}{:<10s}'.format(*['Column','Table','DataType'])) 
     for row in new_list: 
      s = '{d[Column]:<10s}{d[Table]:<15s}{d[DataType]:<10s}'.format(d=row) 
      print(s) 


>>> f(new_list) 
Column Table   DataType 
C1  A    int  
C2  A    varchar 
C3  B    int 
+0

Danke. scheint, als ob die Daten korrekt formatiert sind. müssen auch für die Header dasselbe tun. @Iron Faust – Pradeep

+0

@Pradeep ..Du könntest das selbst als Übung machen, aber trotzdem den Code updaten. –

+0

@Pradeep ... Wenn Sie der Meinung sind, dass diese Antwort die richtige Lösung für Sie ist, dann nehmen Sie sie oder irgendjemand anders an. Andernfalls, wenn Ihr Problem immer noch nicht gelöst ist, * bearbeiten * Sie Ihre Frage mit einem Update. –

0

bin Erraten ich zum Teil, aber vielleicht ist es das, was Sie wollen:

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'}, 
      {'Table':'A', 'Column':'C2', 'DataType':'varchar'}, 
      {'Table': 'B', 'Column': 'C3', 'DataType': 'int'} 
      ] 
# print in terminal 
print "\t".join(new_list[0].keys()) 
for d in new_list: 
    print "{}\t{}\t{}".format(d["Table"], d["Column"],d["DataType"]) 

# write to file 
with open("outfile", "w") as f: 
    f.write("\t".join(new_list[0].keys()) + "\n") 
    for d in new_list: 
     f.write("{}\t{}\t{}\n".format(d["Table"], d["Column"],d["DataType"])) 

Ergebnis:

$ cat outfile 
Column Table DataType 
A  C1  int 
A  C2  varchar 
B  C3  int 
+0

aber no, wo Sie die Position erwähnt haben, wo die Daten beginnen und enden. Ich muss den Positionen für jeden Kopf folgen, sonst liest der andere Prozess falsche Daten. @jDo – Pradeep

+0

@Pradeep Nun, dann tun 'für d in new_list [0: 9]:', 'für d in new_list [10:24]:', etc. Wenn die Spalten immer 10 Indizes voneinander entfernt sind, können Sie wahrscheinlich verwenden Modul 9 oder 10 – jDo

Verwandte Themen