【问题标题】:Python search csv file from input text filePython从输入文本文件中搜索csv文件
【发布时间】:2013-12-06 05:33:02
【问题描述】:

我是 python 新手,我在这段代码中苦苦挣扎。有 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)

【问题讨论】:

    标签: python


    【解决方案1】:

    将电子邮件加载到 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 并且您似乎对 namesline 有一些命名问题和row...

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2014-11-27
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多