使用python将两个CSV文件合并为dictread

2024-10-01 15:47:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这个问题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语句中给了我一个错误,但更重要的是,我似乎无法访问iterable中字典的['member']元素,因为它说它没有属性“getitem”。在

有人有什么想法吗?作为参考,我需要将列表保持为ITerable,因为每个文件太大,无法放入内存中。我们的计划是在另一个for循环中控制整个函数,该循环一次只向它提供几行代码以进行迭代。因此,它将读取左侧文件的一行,遍历整个第二个文件以找到匹配的成员字段,然后将这两行连接起来,类似于SQL join语句。在

感谢您的帮助,请原谅我的任何明显错误。在


Tags: 文件对象代码in信息列表formember
1条回答
网友
1楼 · 发布于 2024-10-01 15:47:34

一些想法:

  • =替换为==。后者用于等式测试;前者用于赋值。

  • 在开头加一行,dictreader2 = list(dictreader2)。这样就可以对字典条目进行多次循环。

  • matchedlist.append((dictline1, dictline2))添加第二对括号。列表.追加方法只接受一个参数,所以需要从dictline1dictline2创建一个元组。

  • 最后一个else: continue是不必要的。for循环将自动为您循环。

  • 使用print语句或类似语句验证dictline1dictline2都是以成员为键的字典对象。可能是您的函数是正确的,但正在用dictreader对象以外的其他对象调用。

在这里输入dicts与返回dicts的示例类似:

>>> 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内部联接的作用):

^{pr2}$

祝你的项目好运:-)

相关问题 更多 >

    热门问题