Python3将DB查询的结果转换为单个字符串

时间:2017-09-25 12:20:36

标签: python sqlite

我在python脚本中有2个函数。

第一个使用WHERE子句从数据库获取数据,但第二个函数使用此数据并遍历结果以下载文件。

我可以将结果作为元组打印出来吗?

[('mmpc',), ('vmware',), ('centos',), ('redhat',), ('postgresql',), ('drupal',)]

但我需要将每个元素作为字符串迭代,以便下载函数可以将其附加到response变量的URL

以下是包含以下功能的下载脚本的代码: -

import requests
import eventlet
import os
import sqlite3


# declare the global variable
active_vuln_type = None
# Get the active vulnerability sets


def GetActiveVulnSets() :
    # make the variable global
    global active_vuln_type
    active_vuln_type = con = sqlite3.connect('data/vuln_sets.db')
    cur = con.cursor()
    cur.execute('''SELECT vulntype FROM vuln_sets WHERE active=1''')
    active_vuln_type = cur.fetchall()
    print(active_vuln_type)
    return(active_vuln_type)
    # return str(active_vuln_type)

def ExportList():
    vulnlist = list(active_vuln_type)
    activevulnlist = ""
    for i in vulnlist:
        activevulnlist = str(i)
        basepath = os.path.dirname(__file__)
        filepath = os.path.abspath(os.path.join(basepath, ".."))
        response = requests.get('https://vulners.com/api/v3/archive/collection/?type=' + activevulnlist)
        with open(filepath + '/vuln_files/' + activevulnlist + '.zip', 'wb') as f:
            f.write(response.content)
            f.close()
        return activevulnlist + " - " + str(os.path.getsize(filepath + '/vuln_files/' + activevulnlist + '.zip'))

目前它创建了一个损坏的.zip作为('mmpc',).zip所以它不是真正的文件,它是mmpc.zip的第一个,但它似乎没有迭代遍历列表,因为它只创建了来自数据库的第一个结果的zip文件,而不是print(i)返回[('mmpc',), ('vmware',), ('centos',), ('redhat',), ('postgresql',), ('drupal',)]

以外的任何其他结果

由于脚本认为它正在运行,因此没有回溯。

1 个答案:

答案 0 :(得分:1)

以下修复了两个问题:1。将查询输出转换为可迭代的字符串; 2.用return函数替换print语句,以便for-loop不会结束过早。

我还冒昧地删除了一些冗余,例如关闭with语句中的文件并毫无意义地将list转换为list。我也在GetActiveVulnSets函数中调用ExportList。这样就不需要在函数定义之外调用GetActiveVulnSets

import requests
import eventlet
import os
import sqlite3


# declare the global variable
active_vuln_type = None
# Get the active vulnerability sets


def GetActiveVulnSets() :
    # make the variable global
    global active_vuln_type
    active_vuln_type = con = sqlite3.connect('data/vuln_sets.db')
    cur = con.cursor()
    cur.execute('''SELECT vulntype FROM vuln_sets WHERE active=1''')
    active_vuln_type = [x[0] for x in cur]
    print(active_vuln_type)
    return(active_vuln_type)
    # return str(active_vuln_type)

def ExportList():
    GetActiveVulnSets()
    activevulnlist = ""
    for i in active_vuln_type:
        activevulnlist = str(i)
        basepath = os.path.dirname(__file__)
        filepath = os.path.abspath(os.path.join(basepath, ".."))
        response = requests.get('https://vulners.com/api/v3/archive/collection/?type=' + activevulnlist)
        with open(filepath + '/vuln_files/' + activevulnlist + '.zip', 'wb') as f:
            f.write(response.content)
        print(activevulnlist + " - " + str(os.path.getsize(filepath + '/vuln_files/' + activevulnlist + '.zip')))

虽然这可以解决您遇到的问题,但我建议您使用参数编写函数。这样,你就知道每个函数应该作为参数接受什么以及它作为输出吐出的内容。实质上,如果可以,请避免使用global变量。它们很难调试,在许多用例中坦率地说是不必要的。

我希望这会有所帮助。