我是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)
答案 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
...