2016-08-19 3 views
0

Ich muss einige Daten in eine TXT-Datei aus Python 3.4/3.2 drucken.Drucken große Daten in Datei mit speziellen Format von Python

Jede Zeile in der Datei hat folgendes Format:

col1 |  col2   | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1   239  CT2 9.66 
    AR  CT3   8.65 
    NY  CT1   6.25  CT2 67.89 
    NY  CT3   78.61 

Für gleiche id1, wenn es mehr als zwei Werte von CT_TYPE sind, müssen sie in den beiden col2 und col3 und nur den letzten Wert gedruckt vom Typ id1 kann col3 leer bleiben. Zum Beispiel ist das folgende Druckformat falsch.

col1 |  col2   | col3     | 
    id1  CT_TYPE value1  CT_TYPE value2 
    AR  CT1  239   " this cannot be left as blank" 
    AR  CT2 9.66    CT3   8.65 

Für einen anderen ID1-Wert muss eine neue Zeile hinzugefügt werden. Fror Beispiel id1 = NY kann nicht auf der gleichen Linie mit AR sein:

AR  CT3 8.65  NY  CT1 6.25 // this is not allowed. 

Es Hunderttausende von Datenleitungen, die gedruckt werden müssen. Ich möchte die Sortierung nicht verwenden, da die Datengröße zu groß ist, um in einer Datenstruktur in Python gespeichert zu werden. Also muss ich die Daten blockweise aus der Datenbank laden und in Datei drucken. Ich kann sicherstellen, dass jeder aus der Datenbank geladene Block den gleichen ID1-Wert hat.

Meine Frage ist, wie man sicherstellen kann, dass das oben genannte Format beibehalten wird, wenn Daten Block für Block gedruckt werden? In Python I verwendet:

with open(fileName, 'a') as f: 
     f.wite(aLine + "\n"); 

Wie die aktuelle Druckposition zu ändern, so dass die CT_type Werte desselben id1 Typs bei der gleichen Zeile gedruckt werden, selbst genug, um eine Neuen-Zeile „\ n“ nach dem hinzugefügt wurde letzte Datenzeile wurde gedruckt. Zum Beispiel, wenn meine Datei hat diesen:

col1 |  col2   | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1  239 

Eine neue Datenleitung in einem neuen Block ist wie:

AR  CT2 9.66 

Ich mag:

col1 |  col2   | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1  239  CT2 9.66 

Nicht:

col1 |  col2  | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1   239    
    AR  CT2  9.66 

Danke

Antwort

0

Wenn ich das Problem richtig verstehe, würde ich etwas verwenden, wo es nur die ID und ctype speichert, bis es eine Übereinstimmung auf ID findet, dann in Datei ausgeben und aus dem Speicher löschen. Die unten ist ILLUST

fobj_in = open('file','r') 
fobj_out = open('output','a') 
unmatched = {} 
for line in fobj_in: 
    elem = line.split('\t') 
    id1, cttype = elem 
    if id1 not in unmatched: 
     unmatched[id1] = cttype 
    else: 
     cttype_ = unmatched.pop(id1) 
     fobj.write('\t'.join([id1,cttype_, cttype])) 
for id in unmatched: 
    fobj.write('\t'.join([id, unmatched.pop(id)])) 
fobj_in.close() 
fobj_out.close() 

Die oben dienen nur zur Illustration und können Fehler oder andere Probleme haben.

Verwandte Themen