Python循环遍历文件数据和输出

时间:2017-07-02 07:39:10

标签: python

我需要使用一些代码来提取包含电子邮件的文件,并与'haveibeenpwned'API进行交互,以返回在公共转储中看到它们的日期。

到目前为止,这就是我在下面的内容,目前我正在努力实施以下内容:

1。)根据API使用指南,每个请求必须延迟1秒。

2。)脚本必须包含一个文件,其中包含要提交的电子邮件(我尝试在命令行上使用for循环调用它但不起作用)。

3。)提交的电子邮件地址必须回显到输出文件,以便与违规数据相关联。

基本上我希望运行脚本,提供一个输入文件(可能带有argparse)然后让脚本将以下示例内容输出到文件中,当它通过提供的电子邮件列表运行时附加... < / p>

  

email1@email.com

     

DATA - 在xxxx-xx-xx

上违反      

email2@email.com

     

DATA - 在xxxx-xx-xx

上违反

非常感谢任何有关所需更改的帮助或建议。您可以通过使用'-a'运行并提供电子邮件地址来查看其当前功能。

import argparse
import json
import requests


def accCheck(acc):
    r = requests.get(
            'https://haveibeenpwned.com/api/v2/breachedaccount/%s?truncateResponse=false' % acc
        )
    data = json.loads(r.text)
    for i in data:
        print(
            i['Name'] +
            ' - Breached on ' +
            i['BreachDate']
        )

def list():
    r = requests.get(
            'https://haveibeenpwned.com/api/v2/breaches'
        )
    data = json.loads(r.text)
    for i in data:
        print(
            i['Name'] +
            ' - Breached on - ' +
            i['BreachDate']
        )

if __name__ == '__main__':
    ap = argparse.ArgumentParser()
    ap.add_argument(
        '-a',
        '--account'
    )
    ap.add_argument(
        '--list',
        action='store_true'
    )
    args = ap.parse_args()
    acc = args.account
    list = args.list
    if not list:
        if not acc:
            print(
                'Specify an account (-a <email>) to check or --list for site info'
            )
            exit(0)
        try:
            accCheck(acc)
        except ValueError:
            print(
                'No breach data found'
            )
    else:
        list()

1 个答案:

答案 0 :(得分:0)

您可以接受输入文件和输出文件作为命令行参数,如下所示:

ap.add_argument(
    '-if',
    '--input_file'
    )

ap.add_argument(
    '-of',
    '--ouput_file'
    )
args = ap.parse_args()

input_file = args.input_file

ouput_file = args.ouput_file

假设您指定为输入文件的文件在每行包含电子邮件帐户,您可以执行以下操作:

with open(input_file,'r') as fl,RedirectStdoutTo(ouput_file):
        for acc in fl:
            try:
                accCheck(acc.rstrip())
            except ValueError:
                print(
                    'No breach data found'
                )

RedirectStdoutTo是您要编写的类,允许您将打印输出重定向到文件

class RedirectStdoutTo:
    def __init__(self, filename):
        self.out_new = open(filename,'w')

    def __enter__(self):
        self.out_old = sys.stdout
        sys.stdout = self.out_new

    def __exit__(self, *args):
        sys.stdout = self.out_old
        self.out_new.close()