Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何循环遍历此列表并将每个项调用到同一个函数?_Python_Python 3.x_Pyopenssl - Fatal编程技术网

在Python中,如何循环遍历此列表并将每个项调用到同一个函数?

在Python中,如何循环遍历此列表并将每个项调用到同一个函数?,python,python-3.x,pyopenssl,Python,Python 3.x,Pyopenssl,你好,我正在尝试建立一个脚本,将列出网站的SSL证书到期日期。codedef sslExpiresDate的第一个函数本身工作得非常好。当我添加第二个函数def all_sites\u list时,我的代码已被破坏。我不知道如何运行sslExpiresDate来获取列表站点中每个URL的结果。我试图通过构建第二个函数并从中调用第一个函数来实现这一点,但它不起作用 我希望预期的结果是一个可读的表格格式(但我还没有做到这一点)。比如: SITE EXP DATE www.s

你好,我正在尝试建立一个脚本,将列出网站的SSL证书到期日期。code
def sslExpiresDate
的第一个函数本身工作得非常好。当我添加第二个函数
def all_sites\u list
时,我的代码已被破坏。我不知道如何运行
sslExpiresDate
来获取列表
站点中每个URL的结果。我试图通过构建第二个函数并从中调用第一个函数来实现这一点,但它不起作用

我希望预期的结果是一个可读的表格格式(但我还没有做到这一点)。比如:

SITE              EXP DATE
www.site1.com     03-05-18
www.site2.com     08-12-19
www.site3.com     12-12-21
同时,这是我正在努力解决的代码。谢谢:

import OpenSSL 
import ssl

sites = ['www.site1.com', 'www.site2.com', 'www.site3.com']

def sslExpiresDate():
    cert = ssl.get_server_certificate((sites, 443)) 
    x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) 
    print(x509.get_notAfter())
    return

def all_sites_list(sites, sslExpiresDate):
    for site in sites():
        sslExpiresDate(site)
    return

all_sites_list(sites, sslExpiresDate)

map函数允许您将序列中的每个值发送给生成结果序列的函数。您可以将此序列与原始序列压缩,以获得所需的表:

import OpenSSL 
import ssl
from datetime import datetime

dateformat = '%Y%m%d%H%M%SZ'

sites = ['www.google.com', 'www.plus.net']

def sslExpiresDate(site):
    cert = ssl.get_server_certificate((site, 443)) 
    x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) 
    return datetime.strptime(x509.get_notAfter().decode(),dateformat).date().isoformat()


def all_sites_list(sites, sslExpiresDate):
    return list(zip(sites,map(sslExpiresDate,sites)))

tab_format = '{:18s}{:18s}'
print(tab_format.format('SITE','EXP DATE'))
for site in sorted(all_sites_list(sites, sslExpiresDate), key=lambda site: site[1]):
    print(tab_format.format(*site))
给出:

SITE              EXP DATE          
www.google.com    2018-07-10        
www.plus.net      2020-02-27        

​

代码不起作用的原因是您正在为站点中的站点()执行
,而不是为站点中的站点执行
。你的
站点
是一个列表,而不是一个返回列表的函数,因此你不需要调用它。除此之外,你还需要编写其他内容,比如将输出格式化为你想要的格式。您可能可以通过各种方式改进代码,例如,让
sslExpiresData
返回一个值供调用方使用,而不是打印出来,什么也不返回。但是您遇到的问题只是一个简单的输入错误。您使用一个参数调用
sslExpiresDate()
,但函数本身没有声明接受任何参数。此外,将该函数作为参数传递给
all\u sites\u list()
(它可以通过名称直接访问)也没有意义,尽管您可能正计划在将来指定其他函数。非常感谢,这是完美的,也是我一直在寻找的。最后一个问题,是否可以按最接近到期日期的日期设置该列表的格式?是的,我们只需要按日期排序。更改代码以适应。别忘了给我打勾!那只是意味着一次投票权,对吗?我试过了,但我认为我的声誉不足以让它出现:(标记它工作得很好,非常感谢你的帮助。我想问,行中的*符号是做什么的:
print(tab_format.format(*site))
我将对您提供的一些代码片段做更多的研究,但我需要知道要查找什么。我对
key=lambda site:site[1])也有点迷茫。
key=lambda是什么意思?就像我说的,一切都很好,但我想自己去学,下次再学。这些行与Python的哪个部分相关?