我意识到回答这个问题的信息可能已经在这里了,但作为一个python newby,我一直试图把信息拼凑几个星期,而且我遇到了一些麻烦。
这个问题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 ”。
有没有人对如何做到这一点有任何想法?作为参考,我需要将列表保持为可迭代,因为每个文件都太大而无法放入内存中。计划是在另一个for循环中控制整个函数,它一次只能为它提供几行迭代。因此,它将读取左侧文件的一行,遍历整个第二个文件以查找匹配的成员字段,然后连接这两行,类似于SQL连接语句。
感谢您提前提供任何帮助,请原谅我的任何明显错误。
答案 0 :(得分:6)
一些想法:
将=
替换为==
。后者用于相等测试;前者用于作业。
在开头dictreader2 = list(dictreader2)
添加一行。这样就可以多次遍历字典条目。
向matchedlist.append((dictline1, dictline2))
添加第二对括号。 list.append 方法只接受一个参数,因此您需要从 dictline1 和 dictline2 创建一个元组。
最终else: continue
是不必要的。 for循环将自动为您循环。
使用print语句或某些来验证 dictline1 和 dictline2 都是成员作为键的字典对象。可能是你的函数是正确的,但是用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'})]
进一步的建议是将两个词典合并为一个条目(这更接近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'}]
祝你的项目好运: - )