2016-08-19 24 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() 

以上仅供参考,可能有错误或其他问题。