Python 从一个函数调用另一个函数

Python calling one function form another

我写了一个 python 脚本来获取目录中的文件,获取哈希,然后将它们写入 table。

第一部分,获取文件和计算哈希值很简单。但现在我添加了函数 (write_record) 来将文件名、日志日期和哈希值存储到数据库中。但我正在努力如何从 get_files 函数调用它并为目录

中的每个文件写一条记录
from datetime import datetime
from os import scandir
import os
import hashlib
import psycopg2
BLOCKSIZE = 65536
hasher = hashlib.sha256()
basepath = '.'

def convert_date(timestamp):
     d = datetime.utcfromtimestamp(timestamp)
     formated_date = d.strftime('%d%m%Y%H%M%S')
     return formated_date

def get_hash(entry):
    with open(entry, 'rb') as afile:
        buf = afile.read(BLOCKSIZE)
        while len(buf) > 0:
            hasher.update(buf)
            buf = afile.read(BLOCKSIZE)
                               # print(hasher.hexdigest())

def get_files():
    dir_entries = scandir('.')
    for entry in dir_entries:
        if entry.is_file():
             info = entry.stat()
        print(' %s %s %s' % (entry.name, convert_date(info.st_mtime),hasher.hexdigest())) 
        log_filename = entry.name
        log_hashvalue = hasher.hexdigest()
        log_date = convert_date(info.st_mtime)
        return log_filename,log_hashvalue,log_date
       # write_record()

def write_record():
    log_filename,log_hashvalue,log_date = get_files()
    try:
        print(log_filename,log_hashvalue,log_date)
        connection = psycopg2.connect(user="postgres",password="xxxxxxxx",host="xxx.xxx.xxx.xxx",port="5432",database="evidence_logging")
        cursor = connection.cursor()
        postgres_insert_query = """ INSERT INTO logfiles (log_name,log_date,log_hashvalue) VALUES (%s,%s,%s)"""
        record_to_insert = (log_filename,log_date,log_hashvalue)
        print(postgres_insert_query, record_to_insert)
        cursor.execute(postgres_insert_query, record_to_insert)
        connection.commit()
        count = cursor.rowcount
        print (count, "Record inserted successfully into logfiles table")

    except (Exception, psycopg2.Error) as error :
        if(connection):
            print("Failed to insert record into logfiles table", error)

    finally:
    #closing database connection.
        if(connection):
            cursor.close()
            connection.close()
            print("PostgreSQL connection is closed")


write_record()

提前致谢 问候 乔治

在您调用 write_record() 方法的代码中,这将仅插入一个文件,因为 get_files() 方法将 return 第一个文件而不是所有文件。

首先你需要调用 get_files() 方法而不是 returning 在此方法中你应该调用 write_record() 方法并使用你从 get_files().

并且在插入每条记录后不关闭连接在插入所有记录后关闭连接。

试试这个

from datetime import datetime
from os import scandir
import os
import hashlib
import psycopg2
BLOCKSIZE = 65536
hasher = hashlib.sha256()
basepath = '.'
connection = None

def convert_date(timestamp):
    d = datetime.utcfromtimestamp(timestamp)
    formated_date = d.strftime('%d%m%Y%H%M%S')
    return formated_date

def get_hash(entry):
    with open(entry, 'rb') as afile:
    buf = afile.read(BLOCKSIZE)
    while len(buf) > 0:
        hasher.update(buf)
        buf = afile.read(BLOCKSIZE)
        # print(hasher.hexdigest())

def get_files():
    dir_entries = scandir('.')
    for entry in dir_entries:
        if entry.is_file():
          info = entry.stat()
        print(' %s %s %s' % (entry.name, convert_date(info.st_mtime),hasher.hexdigest())) 
        log_filename = entry.name
        log_hashvalue = hasher.hexdigest()
        log_date = convert_date(info.st_mtime)
        write_record(log_filename,log_hashvalue,log_date)
    #close the connection after writing all records
    close_connection()

def write_record(log_filename,log_hashvalue,log_date):
    try:
        print(log_filename,log_hashvalue,log_date)
        connection = psycopg2.connect(user="postgres",password="xxxxxxxx",host="xxx.xxx.xxx.xxx",port="5432",database="evidence_logging")
        cursor = connection.cursor()
        postgres_insert_query = """ INSERT INTO logfiles (log_name,log_date,log_hashvalue) VALUES (%s,%s,%s)"""
        record_to_insert = (log_filename,log_date,log_hashvalue)
        print(postgres_insert_query, record_to_insert)
        cursor.execute(postgres_insert_query, record_to_insert)
        connection.commit()
        count = cursor.rowcount
        print (count, "Record inserted successfully into logfiles table")

    except (Exception, psycopg2.Error) as error :
        if(connection):
            print("Failed to insert record into logfiles table", error)

    finally:
        cursor.close()

def close_connection():
    if(connection):
        connection.close()
        print("PostgreSQL connection is closed")

get_files()