2013-07-11 48 views
1

我有一個大的(2.2GB)文本分隔文件,它包含化學路徑,當我想從化學A到化學B去搜索化學路徑時,我想知道是否有人知道一種方式(最好在Python中),我可以通過連續的列數對文件進行排序?按每列的列數對csv進行排序

例子:

CSV:

A B C D 
E F G 
H I 
J K L M N 

會排到:

H I 
E F G 
A B C D 
J K L M N 

我一直在想使排長度和行的哈希表的,但作爲CSV文件變得更大:(我們在化學網絡上運行最長路徑,2.2gb(30mil路徑)只有長度爲< = 10),我預計這種方法可能不是最快的。

+0

我將建立一個索引和排序這一點。例如,對於化學路徑文件中的每一行,在'(length,pointer_to_line)'的索引中創建一個元組。長度很簡單,因爲你可以做'len(row.split())'。該行的指針可以通過'f.tell()'或類似的東西來完成。對索引進行排序。一旦分類完畢,就可以使用它來按順序從化學路徑文件中抓取線條,然後將其寫入新文件。編輯:[這篇文章](http://stackoverflow.com/questions/7079473/sorting-large-text-data)可能會有所幫助。 – wflynny

+0

我的第一反應是將這些數據放入數據庫中,而不是試圖用CSV強行處理(儘管您可能已經從數據庫中讀取數據!)。如果需要,您將擁有數據庫的好處,並且能夠使用Python + SQL在將來進行更多類型的數據分析。 – mdscruggs

回答

5

我會去爲他們分成基礎上,長度單獨的文件,然後將它們連接到一起之後 - 是這樣的:

from tempfile import TemporaryFile 
from itertools import chain 

保持文件長度 - >輸出文件的參考字典。在文件已經打開的情況下,寫入文件或創建一個新的臨時文件。

output = {} 
with open('input') as fin: 
    for line in fin: 
     length = len(line.split()) 
     output.setdefault(length, TemporaryFile()).write(line) 

正如史蒂芬Rumbalski指出,這也可以用做defaultdict

from collections import defaultdict 
output = defaultdict(TemporaryFile) 
... 
output[length].write(line) 

臨時文件都將指向文件的末尾。其重置爲開頭,以便通過他們讀書的時候,我們再次得到數據...

for fh in output.values(): 
    fh.seek(0) 

採取行從每個文件中增加長度的秩序......並把它們所有寫到最終輸出文件。

with open('output', 'w') as fout: 
    fout.writelines(chain.from_iterable(v for k,v in sorted(output.iteritems()))) 

的Python應該再清理臨時文件在程序退出...

+2

非常pythonic,對新來的人來說不是真正可讀的。應該在我看來評論。 –

+0

@btoueg稍加註釋 - 讓我知道如果你認爲它需要更多 –

+0

正是我所需要的!非常感謝你:) – Darkstarone

相關問題