2012-02-28 57 views
1

我意識到回答這個問題的信息可能已經在這裏,但作爲一個python newby我一直試圖拼湊信息幾個星期了,我打了有些麻煩。在python中使用dictreader加入兩個CSV文件

這個問題Python "join" function like unix "join"答案如何輕鬆地在兩個列表上做一個連接,但問題是dictreader對象是可迭代的而不是直接的列表,這意味着有一個額外的複雜層次。

我基本上是在使用dictreader對象尋找兩個CSV文件的內連接。下面的代碼我到目前爲止:

def test(dictreader1, dictreader2): 
    matchedlist = [] 
    for dictline1 in dictreader1: 
      for dictline2 in dictreader2: 
       if dictline1['member']=dictline2['member']: 
        matchedlist.append(dictline1, dictline2) 
       else: continue 
    return matchedlist 

這是給我的if語句錯誤,但更重要的是,我似乎不能夠訪問該字典的[「成員」]元素在可迭代內,因爲它表示它沒有屬性「getitem」。

有沒有人有任何想法如何做到這一點?作爲參考,我需要將列表保存爲迭代列表,因爲每個文件都太大而不適合內存。計劃是在另一個for循環中控制整個函數,每次僅爲它提供幾行代碼以迭代。因此,它將讀取左手文件的一行,迭代整個第二個文件以查找匹配並連接兩行的成員字段,類似於SQL連接語句。

感謝您提前提供任何幫助,請原諒我的任何明顯錯誤。

回答

6

的一點想法:

  • 更換===。後者用於平等測試;前者的任務。

  • 添加一行開始,dictreader2 = list(dictreader2)。這將使得有可能多次循環字典條目。

  • 將第二對括號添加到matchedlist.append((dictline1, dictline2))list.append方法只需要一個參數,因此您想要創建一個元組,其中dictline1dictline2

  • 最後的else: continue是不必要的。 for循環會自動循環。

  • 使用print語句或諸如此類驗證dictline1dictline2是具有成員作爲重點既字典對象。這可能是你的功能是正確的,但被稱爲除了代碼對象以外的東西。

下面是一個使用(類似於一個DictReader將返回)類型的字典爲輸入列表的制定例如:

>>> def test(dictreader1, dictreader2): 
     dictreader2 = list(dictreader2) 
     matchedlist = [] 
     for dictline1 in dictreader1: 
      for dictline2 in dictreader2: 
       if dictline1['member'] == dictline2['member']: 
        matchedlist.append((dictline1, dictline2)) 
     return matchedlist 

>>> dr1 = [{'member': 2, 'value':'abc'}, {'member':3, 'value':'def'}] 
>>> dr2 = [{'member': 4, 'tag':'t4'}, {'member':3, 'tag':'t3'}] 
>>> test(dr1, dr2) 
[({'member': 3, 'value': 'def'}, {'member': 3, 'tag': 't3'})] 

另一項建議是將兩個庫合併成一個單一的入口(這是更接近什麼的SQL內部聯接會做):

>>> def test(dictreader1, dictreader2): 
     dictreader2 = list(dictreader2) 
     matchedlist = [] 
     for dictline1 in dictreader1: 
      for dictline2 in dictreader2: 
       if dictline1['member'] == dictline2['member']: 
        entry = dictline1.copy() 
        entry.update(dictline2) 
        matchedlist.append(entry) 
     return matchedlist 

>>> test(dr1, dr2) 
[{'member': 3, 'tag': 't3', 'value': 'def'}] 

祝你的項目:-)

+0

那重盟友非常感謝,作品精美!我認爲我的一個問題是,在將它們傳遞給函數之前,我正在打印這兩個dictreaders,在函數讀取它之前似乎已經耗盡了迭代器...現在我只需要設法重置它。 感謝您的更新字典的提示,這是一個更好的方法來做到這一點! – analystic 2012-02-29 13:44:26

+0

@analystic很高興有幫助。你能否將答案標記爲已接受? – 2012-02-29 20:00:23

+0

現在我有足夠的聲望,完成了! – analystic 2012-03-01 23:19:23