我正在尝试将两个excel文档相互比较,它们由大约6000行和4列组成,第一列是域名,另外三列是注释,其中一个文档已更新注释一些列,最后我希望这个脚本的功能就像批量更新新的注释,取代旧的过时的。
到目前为止我编写的代码打开文档并将它们添加到两个单独的列表中:
import csv
newlist = csv.reader(open('newcomments.csv','rU'), dialect='excel')
export = csv.reader(open('oldcomments.csv', 'rU'), dialect='excel')
for row in newlist:
olddomain=[]
domain = row[0:]
olddomain.append(domain)
for item in olddomain:
print item
for row in export:
newdomain=[]
domain= row[0:]
newdomain.append(domain)
for item in newdomain:
print item
列表的输出看起来像(第二列通常是空白的):
['example.com', '', 'excomment', 'Parked Page']
在尝试比较列表时,我尝试了类似的内容:
if item in olddomain != item in newdomain:
print "no match"
else:
print "match"
但这似乎不起作用,例如,两个文件中的第一行包含完全相同的数据,但代码返回“不匹配”,两个文件中的第二行也包含相同的数据,但是代码返回“匹配”
问题是我将行保存到列表中的方式,还是我还缺少其他东西?我会假设有一种更好的方法可以做到这一点,但我用它作为学习更多python的借口!
感谢您的时间。
答案 0 :(得分:7)
您似乎正在尝试将旧的域名列表与新的域名列表进行比较。在构建这些列表之后,您希望查看列表之间是否存在共性。
在这种情况下,我认为set()
提供了更丰富的功能,让您的生活更轻松。例如:
>>> olddomains = set(['www.cisco.com', 'www.juniper.com', 'www.hp.com'])
>>> newdomains = set(['www.microsoft.com', 'www.cisco.com', 'www.apple.com'])
>>> olddomains.intersection(newdomains)
set(['www.cisco.com'])
>>>
>>> 'www.google.com' in newdomains
False
>>>
重写部分代码以使用集合将如下所示:
# retain newlist, since that's the output from csv...
for row in newlist:
olddomain = set([])
domain = row[0]
olddomain.add(domain.lower()) # use lower() to ensure no CAPS mess things up
for item in olddomain:
print item
您询问的代码:
if olddomain.intersection(newdomain) == set([]):
print "no match"
else:
print "match"
我在确定使用set()
还是list()
时使用的一般规则:
由于您问为什么我发布的代码会引发TypeError
,如果您按照我的方式分配row
,那么您需要使用row[0]
代替{{ 1}}
row[0:]
我改变了我的例子以反映这一点,因为我怀疑这就是问题所在。
答案 1 :(得分:3)
你很可能只是缺少了parantheses。请注意,以下两行相同,因为in
和!=
的{{3}}相等:
if item in olddomain != item in newdomain:
if ((item in olddomain) != item) in newdomain:
你可能想要:
if (item in olddomain) != (item in newdomain):
答案 2 :(得分:0)
尝试将其设为一套,然后进行操作。
示例:
在[1]中:a = ['a','b','c']
在[2]中:b = ['b','a','c']
在[3]中:set(a)&组(b)中
Out [3]:{'a','b','c'}
在[4]中:set(b)== set(a)&组(b)中
Out [4]:True