使用dictreader在python中加入两个CSV文件

ana*_*tic 1 python database csv

我知道回答这个问题的信息可能已经在这里了,但作为一个python newby,我一直试图拼凑几个星期的信息,我遇到了一些麻烦.

这个问题Python"join"函数就像unix"join"一样,回答了如何轻松地在两个列表上进行连接,但问题是dictreader对象是可迭代的而不是简单的列表,这意味着还有一层复杂的问题.

我基本上在寻找两个CSV文件的内部联接,使用dictreader对象.这是我到目前为止的代码:

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
Run Code Online (Sandbox Code Playgroud)

这在if语句中给了我一个错误,但更重要的是,我似乎无法在iterable中访问字典的['member']元素,因为它说它没有属性" getitem ".

有没有人对如何做到这一点有任何想法?作为参考,我需要将列表保持为可迭代,因为每个文件都太大而无法放入内存中.计划是在另一个for循环中控制整个函数,它一次只能为它提供几行迭代.因此,它将读取左侧文件的一行,遍历整个第二个文件以查找匹配的成员字段,然后连接两行,类似于SQL连接语句.

感谢您提前提供任何帮助,请原谅我的任何明显错误.

Ray*_*ger 6

一些想法:

  • 更换===.后者用于相等测试; 前者用于作业.

  • 在开头添加一行dictreader2 = list(dictreader2).这样就可以不止一次地遍历字典条目.

  • 添加第二对括号matchedlist.append((dictline1, dictline2)).该list.append方法只需一个参数,所以你想创建一个元组出dictline1dictline2.

  • 决赛else: continue是不必要的.for循环将自动循环为您.

  • 使用print语句或某些来验证dictline1dictline2都是具有成员作为键的字典对象.可能是你的函数是正确的,但是用dictreader对象以外的东西调用.

这是一个使用dicts列表作为输入的示例(类似于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'})]
Run Code Online (Sandbox Code Playgroud)

另一个建议是将两个词典组合成一个条目(这更接近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'}]
Run Code Online (Sandbox Code Playgroud)

祝你的项目好运:-)