2010-11-22 43 views
4

我很好奇,如果有喜歡的UNIX版本內置Python加入功能(參見http://linux.about.com/library/cmd/blcmdl_join.htm)。我知道這個功能是通過內置的sqlite3模塊來實現的,並且可能通過一些其他模塊,比如pytables。Python的「加入」類似Unix的功能「加入」

很抱歉,如果這是一個基本的問題,但我發現,搜索「蟒蛇加入」和相關查詢由標準Python加入功能相當污染。另外,如果沒有這樣的功能,我不會期望很容易地找到這些信息。

回答

6

這裏的加入功能的Python版本,不處理所有潛在的錯誤情況。但是展示了基本的想法。

# usage join(open('f1.txt'), open('f2.txt')) 

def join(fd_a, fd_b) : 
    result = [] 
    la = fd_a.readline() 
    lb = fd_b.readline() 
    while la and lb : 
     start_a, rest_a = la.split(' ', 1) 
     start_b, rest_b = lb.split(' ', 1) 
     if cmp(start_a, start_b) == 0 : 
      result.append([start_a, [rest_a, rest_b]]) 
      la = fd_a.readline() 
      lb = fd_b.readline() 
     elif cmp(start_a, start_b) < 0 : 
      la = fd_a.readline() 
     else : 
      lb = fd_b.readline() 
    return result 
+0

+1因爲它看起來像一個很好的unix`join`模擬,包括文本文件中字段的隱式定義。 – martineau 2010-11-22 17:30:56

4

您可以方便地模擬聯接使用字典:

d1 = {"a": 1, "b": 2} 
d2 = {"b": 3, "c": 4} 
print dict((key, (d1[key], d2[key])) for key in d1 if key in d2) 
{'b': (2, 3)} 

或者,在Python 3.X的最後一行:

print {key: (d1[key], d2[key]) for key in d1.keys() & d2.keys()} 
{'b': (2, 3)} 

(2.x版本的也工作在Python 3。 x,但使用&獲得字典鍵的交集可能會加快速度,如果只有一小部分d1的鍵位於交叉點處)。

我不知道在單個函數調用中是否需要內置此功能。

1

如果是在Unix上運行的Python號,你可以在外部使用subprocess模塊運行的命令。