Python从输入文本文件中搜索csv文件

时间:2013-11-21 16:14:05

标签: python

我是python的新手,我在努力学习这段代码。有2个文件,第1个文件是包含电子邮件地址的文本文件(每行1个),第2个文件是包含5-6列的csv文件。脚本应从file1获取搜索输入并在文件2中搜索,输出应存储在另一个csv文件中(仅前3列),请参见下面的示例。我也复制了一个我正在处理的脚本。如果有更好/更有效的脚本,请告诉我。谢谢,谢谢你的帮助。

File1 (output.txt)
rrr@company.com
eee@company.com
ccc@company.com

File2 (final.csv)
Sam,Smith,sss@company.com,admin
Eric,Smith,eee@company.com,finance
Joe,Doe,jjj@company.com,telcom
Chase,Li,ccc@company.com,IT

output (out_name_email.csv)
Eric,Smith,eee@company.com
Chase,Li,ccc@company.com

这是脚本

import csv
outputfile = 'C:\\Python27\\scripts\\out_name_email.csv'
inputfile = 'C:\\Python27\\scripts\\output.txt'
datafile = 'C:\\Python27\\scripts\\final.csv'

names=[]

with open(inputfile) as f:
    for line in f:
        names.append(line)

with open(datafile, 'rb') as fd, open(outputfile, 'wb') as fp_out1:
    writer = csv.writer(fp_out1, delimiter=",")
    reader = csv.reader(fd, delimiter=",")
    headers = next(reader)
    for row in fd:
        for name in names:
            if name in line:
                writer.writerow(row)

1 个答案:

答案 0 :(得分:3)

将电子邮件加载到set进行O(1)查找:

with open(inputfile) as fin:
    emails = set(line.strip() for line in fin)

然后循环遍历行,并检查它是否存在于emails中 - 无需遍历每行的每个可能匹配:

# ...
for row in reader:
    if row[1] in emails:
        writer.writerow(row)

如果你没有做任何其他事情,那么你可以做到:

writer.writerows(row for row in reader if row[1] in emails)

您原始代码中的一些注释,您没有使用csv.reader对象reader - 您正在循环fd,并且您似乎在{{1}时遇到了一些命名问题}}和names以及line ...