Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dictreader在python中连接两个CSV文件_Python_Database_Csv - Fatal编程技术网

使用dictreader在python中连接两个CSV文件

使用dictreader在python中连接两个CSV文件,python,database,csv,Python,Database,Csv,我意识到回答这个问题的信息可能已经在这里了,但是作为一个python新手,我已经试着把这些信息拼凑在一起好几个星期了,我遇到了一些麻烦 这个问题回答了如何轻松地连接两个列表,但问题是dictreader对象是可编辑的,而不是简单的列表,这意味着增加了一层复杂性 我基本上是在寻找两个CSV文件的内部连接,使用dictreader对象。以下是我目前掌握的代码: def test(dictreader1, dictreader2): matchedlist = [] for dictl

我意识到回答这个问题的信息可能已经在这里了,但是作为一个python新手,我已经试着把这些信息拼凑在一起好几个星期了,我遇到了一些麻烦

这个问题回答了如何轻松地连接两个列表,但问题是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
这在if语句中给了我一个错误,但更重要的是,我似乎无法访问iterable中字典的['member']元素,因为它说它没有属性“getitem

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

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

一些想法:

  • =
    替换为
    =
    。后者用于平等性测试;前者负责分配任务

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

  • 在匹配列表中添加第二对括号。追加((dictline1,dictline2))。append方法只接受一个参数,因此您希望从dictline1和dictline2创建一个元组

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

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

下面是一个使用dicts列表作为输入的示例(类似于DictReader将返回的内容):

进一步的建议是将两个字典合并成一个条目(这更接近SQL内部联接的功能):

祝你的项目好运:-)

一些想法:

  • =
    替换为
    =
    。后者用于平等性测试;前者负责分配任务

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

  • 在匹配列表中添加第二对括号。追加((dictline1,dictline2))。append方法只接受一个参数,因此您希望从dictline1和dictline2创建一个元组

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

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

下面是一个使用dicts列表作为输入的示例(类似于DictReader将返回的内容):

进一步的建议是将两个字典合并成一个条目(这更接近SQL内部联接的功能):


祝你的项目好运:-)

太好了,谢谢,效果很好!我认为我的问题之一是,在将两个dictreader传递给函数之前,我正在打印它们,这似乎在迭代器被函数读取之前就已经耗尽了迭代器。。。现在我只需要想出一个方法来重置它。谢谢你提供的关于更新字典的提示,这是一个更好的方法!那真是太好了,谢谢,效果很好!我认为我的问题之一是,在将两个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'})]
>>> 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'}]