Python循环覆盖以前写入json文件的文本



我有一个python脚本,它执行sql查询并将查询的输出写入.json文件。然而,每次它为我写入json文件时,都会覆盖以前写入的文本。我希望每个sql查询都被写入一个新的单独的.json中。如有任何帮助,我们将不胜感激!

from __future__ import print_function
try:
import psycopg2
except ImportError:
raise ImportError('n33[33mpsycopg2 library missing. pip install psycopg233[1;mn')
sys.exit(1)
import re
import sys
import json
DB_HOST = 'crt.sh'
DB_NAME = 'certwatch'
DB_USER = 'guest'
OUTPUT_DIR="output/"
def connect_to_db(domain_name):
try:
conn = psycopg2.connect("dbname={0} user={1} host={2}".format(DB_NAME, DB_USER, DB_HOST))
cursor = conn.cursor()
cursor.execute("SELECT ci.NAME_VALUE NAME_VALUE FROM certificate_identity ci WHERE ci.NAME_TYPE = 'dNSName' AND reverse(lower(ci.NAME_VALUE)) LIKE reverse(lower('%{}'));".format(domain_name))
except:
print("n33[1;31m[!] Unable to connect to the databasen33[1;m")
return cursor

def get_unique_emails(cursor, domain_name):
unique_emails = []
for result in cursor.fetchall():
matches=re.findall(r"'(.+?)'",str(result))
for email in matches:
if email not in unique_emails:
if "{}".format(domain_name) in email:
unique_emails.append(email)
return unique_emails

def print_unique_emails(unique_emails):
print("33[1;32m[+] Total unique emails found: {}33[1;m".format(len(unique_emails)))
for unique_email in sorted(unique_emails):
print(unique_email)

if __name__ == '__main__':
filepath = 'test.txt'
with open(filepath) as fp:
for cnt, domain_name in enumerate(fp):
print("Line {}: {}".format(cnt, domain_name))
print(domain_name)
domain_name = domain_name.rstrip()
cursor = connect_to_db(domain_name)
unique_emails = get_unique_emails(cursor, domain_name)
print_unique_emails(unique_emails)
outfilepath = OUTPUT_DIR + unique_emails + ".json"
with open(outfilepath, 'w') as outfile:
outfile.write(json.dumps(unique_emails, sort_keys=True, indent=4))
with open(outfilepath, 'w') as outfile:
outfile.write(json.dumps(unique_emails, sort_keys=True, indent=4))

您当前正在打开要写入的文件。您想追加到文件中。您可以通过将w更改为a来完成此操作

with open(outfilepath, 'a') as outfile:
outfile.write(json.dumps(unique_emails, sort_keys=True, indent=4))

您可以在此处阅读有关open()的文档。

我认为这是因为在编写json文件时没有循环,只有一次写入,所以它只写入一个文件。所以你需要做一些像你在。。。enumerate(fp(:。制作另一个for循环,在每个域上循环,并将您的OUTPUT_DIR+unique_emails+".json"更改为OUTPUT_DIR+domain_name+".jsn"。

最新更新