<p>srgerg的答案是非常低效的,因为它在二次时间内运行;下面是一个线性时间解决方案,它使用了Python 2.6兼容的语法:</p>
<pre><code>import csv
with open('masterlist.csv', 'rb') as master:
master_indices = dict((r[1], i) for i, r in enumerate(csv.reader(master)))
with open('hosts.csv', 'rb') as hosts:
with open('results.csv', 'wb') as results:
reader = csv.reader(hosts)
writer = csv.writer(results)
writer.writerow(next(reader, []) + ['RESULTS'])
for row in reader:
index = master_indices.get(row[3])
if index is not None:
message = 'FOUND in master list (row {})'.format(index)
else:
message = 'NOT FOUND in master list'
writer.writerow(row + [message])
</code></pre>
<p>这将生成一个字典,首先将签名从<code>masterlist.csv</code>映射到行号。在字典中查找需要恒定的时间,使第二个循环在<code>hosts.csv</code>行上,独立于<code>masterlist.csv</code>中的行数。更不用说更简单的代码了。</p>
<p>对于那些使用Python 3的用户,上面的调用只需要将<code>open()</code>调整为以文本模式打开(从文件模式中删除<code>b</code>),并且您希望添加<code>new line=''</code>,这样CSV读取器就可以控制行分隔符。您可能希望声明要显式使用的编码,而不是依赖于系统默认值(使用<code>encoding=...</code>)。可以通过字典理解(<code>{r[1]: i for i, r in enumerate(csv.reader(master))}</code>)来构建<code>master_indices</code>映射。</p>