2010-08-24 76 views
1

基本上我有一堆包含域的文件。我已經使用.sort(key = func_that_returns_tld)在Python中合併排序

根據其頂級域名對每個單獨的文件進行了排序,現在我已經完成了我想要合併所有文件並最終生成一個大規模排序文件。我想我需要這樣的事情:

open all files 
read one line from each file into a list 
sort list with .sort(key=func_that_returns_tld) 
output that list to file 
loop by reading next line 

我在想這個權利嗎?任何關於如何做到這一點的建議,將不勝感激。

+0

unix'sort'命令有什麼問題? – 2010-08-24 18:37:06

+0

什麼也沒有,但我不是在這個項目的Linux。 ; /我正在爲別人做這件事,該文件只是爲了從他們的機器上遷移而來。 – 2010-08-24 18:41:06

+0

記住Python在Linux以外的平臺上存在...''Sort-Object'在PowerShell中可用 – 2010-08-24 18:43:45

回答

8

如果您的文件不是很大,那麼只需將它們全部讀入內存(如S. Lott所建議的那樣)。這絕對是最簡單的。

但是,您提到的排序規則會創建一個「大規模」文件。如果它太大而不適合內存,那麼可能使用heapq.merge。設置起來可能有點困難,但它的優點是不需要將所有迭代器件一次拉入內存。

import heapq 
import contextlib 

class Domain(object): 
    def __init__(self,domain): 
     self.domain=domain 
    @property 
    def tld(self): 
     # Put your function for calculating TLD here 
     return self.domain.split('.',1)[0] 
    def __lt__(self,other): 
     return self.tld<=other.tld 
    def __str__(self): 
     return self.domain 

class DomFile(file): 
    def next(self): 
     return Domain(file.next(self).strip()) 

filenames=('data1.txt','data2.txt') 
with contextlib.nested(*(DomFile(filename,'r') for filename in filenames)) as fhs: 
    for elt in heapq.merge(*fhs): 
     print(elt) 

與DATA1.TXT:

google.com 
stackoverflow.com 
yahoo.com 

和data2.txt:

standards.freedesktop.org 
www.imagemagick.org 

產量:

google.com 
stackoverflow.com 
standards.freedesktop.org 
www.imagemagick.org 
yahoo.com 
+0

我不知道如何在我的情況下完成這項工作。我需要使用.sort()的'key'函數,因爲我基於TLD而不是第一個字符排序 – 2010-08-24 18:53:07

+0

我編輯了我的答案以顯示如何排序數字以外的其他內容。 – unutbu 2010-08-24 19:03:07

+0

@〜unutbu:你可以使用'sorted(lst,key = Domain)'來代替顯式映射。 – 2010-08-24 19:41:06

0

除非你的文件是不可思議的巨大的,它適合進入記憶。

您的僞代碼很難閱讀。請正確縮進您的僞代碼。最後的「通過閱讀下一行」循環是沒有意義的。

基本上就是這樣。

all_data= [] 
for f in list_of_files: 
    with open(f,'r') as source: 
     all_data.extend(source.readlines()) 
all_data.sort(... whatever your keys are...) 

你完成了。您可以將all_data寫入一個文件,或者進一步處理它或任何您想要處理的文件。

+0

是幾個演唱會太巨大? – 2010-08-24 21:06:33

+0

@ d-c:沒有。一些演出很好。你必須得到更多的演出,而不是在你的操作系統交換空間中配置虛擬內存,然後纔開始重要。 – 2010-08-24 22:47:30

0

另一種選擇(同樣,只有當您的所有數據都不適合內存時)是創建一個SQLite3數據庫並在那裏進行排序並將其寫入文件。