使用其他名称为每个函数调用保存CSV



现在我可以一次创建一个包含所有内容的CSV文件。

现在我想创建一个列表,其中包含不同的名称

如何为每个函数生成不同的CSV文件名?我想过循环一个列表,但我只想在每次调用时进行+1次迭代。我想以某种方式保存我的状态,并在下一个函数调用中使用它。每次我用0初始化我的变量,所以我不会得到1。我想我可以用Python函数参数调用来做到这一点,但我不知道如何使用它。有人能给我一个小提示或例子吗?如果有更好的想法(也许我的想法完全是胡说八道(,如何解决这个问题,请帮忙。

代码中的注释将代表我的想象。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tenable.sc import SecurityCenter as SC
import os.path
import sys
import getpass
import csv
SC_HOST = '...'
def parse_entry(entry): 
split_after_path = ''
ip = entry.get('ip', None)
pluginText = entry.get('pluginText', None)
if 'Path : ' in pluginText:
for line in pluginText.splitlines(0):      
if 'Path : ' in line:
split_after_path_in_plugintext = line.split("Path : ",1)[1]
# place = ['place1', 'place2', 'place3', 'place4', 'place5']
# i = 0
# i = i+1
file_exists = os.path.isfile('testfile_path.csv')
# file_exists = os.path.isfile('testfile_path_'+place[i]+'.csv')
data = open('testfile_path.csv', 'a')
# data = open('testfile_path_'+place[i]+'.csv', 'a')
with data as csvfile:
header = ['IP Address', 'Path']
writer = csv.DictWriter(csvfile, lineterminator='n', quoting=csv.QUOTE_NONNUMERIC, fieldnames=header)
if not file_exists:
writer.writeheader()
writer.writerow({'IP Address': ip, 'Path': split_after_path})
data.close()

def main():
sc_user = input('[<<] username: ')
sc_pass = getpass.getpass('[<<] password: ')
sc = SC(SC_HOST)
sc.login(sc_user, sc_pass)
# Query API for data
# asset = [12,13,14,25,29]
# i = 0
# assetid = asset[i]
# vuln = sc.analysis.vulns(('pluginID', '=', '25072')('asset','=','assetid'))
# i = i+1
vuln = sc.analysis.vulns(('pluginID', '=', '25072'),('asset','=','11'))
for entry in vuln:
parse_entry(entry)
sc.logout()
return 0
if __name__ == '__main__':
sys.exit(main())

最简单、最明显的解决方案是将完整的文件路径传递给parse_entry函数,即:

def parse_entry(entry, filepath): 
# ...
if 'Path : ' in pluginText:
for line in pluginText.splitlines(0):      
if 'Path : ' in line:
# ...    
file_exists = os.path.isfile(filepath)    
with open(filepath, 'a') as csvfile:
# ...

然后在main()中使用enumerate()构建顺序文件名:

def main():
# ...
for i, entry in enumerate(vuln):
path = "'testfile_path{}.csv".format(i)
parse_entry(entry, path)

您可以使用函数属性来跟踪函数被调用的次数。

def parse_entry(entry):
parse_entry.i += 1
# outside the function you have to initialize the attribute
parse_entry.i = 0

或者,您可以在本文中查看初始化函数属性的其他方法。

或者,您可以使用glob来获取当前的文件数。

from glob import glob
i = len(glob('testfile_path_*.csv'))

最新更新