2016-08-19 48 views
0

我需要從Python 3.4/3.2打印一些數據到txt文件。將大數據打印爲Python中的特殊格式

文件中的每一行具有以下格式:

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 

對於相同ID1,如果有CT_TYPE超過2倍的值,就必須在兩個COL2和COL3和僅最後的值的被打印的id1類型可以讓col3爲空。例如,以下打印格式是錯誤的。

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 

對於不同的id1值,必須添加一個新行。 Fror示例,id1 = NY不能與AR位於同一行:

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

有幾十萬條數據行需要打印。我不想使用排序,因爲數據大小要保存在Python中的數據結構中。所以,我必須逐塊加載數據庫中的數據並將它們打印到文件中。我可以確保從數據庫加載的每個塊都具有相同的id1值。

我的問題是如何確保在數據逐塊打印時保持上述格式? 在Python中,我使用:

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

如何改變當前打印位置,使得同一ID1類型的CT_type值在「\ n」個已後所添加的同一行甚至足以換行符印刷最後的數據行被打印出來。例如,如果我的文件中有這些:

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

在新塊的新數據線是這樣的:

AR  CT2 9.66 

我想:

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

不:

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

謝謝

回答

0

如果我正確地理解了這個問題,我會使用它只存儲id和cttype的內容,直到找到id上的匹配項,然後從內存中輸出到文件和del。以下是插圖

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() 

以上僅供參考,可能有錯誤或其他問題。