2017-09-25 82 views
0

我在Python腳本中有2個函數。Python3將數據庫查詢的結果轉換爲單個字符串

第一個使用WHERE子句從數據庫獲取數據,但第二個函數使用此數據並遍歷結果以下載文件。

我可以打印結果作爲元組?

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

但我需要通過每個元素作爲一個字符串迭代所以下載功能,可以將其追加到的URL response變量

這裏是其中所包含的功能下載腳本代碼: -

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的第一個實際的文件,但它似乎並沒有通過無論是作爲它僅創建列表中迭代來自DB的第一個結果的zip文件,而不是其他任何其他文件,但是print(i)返回[('mmpc',), ('vmware',), ('centos',), ('redhat',), ('postgresql',), ('drupal',)]

腳本認爲它沒有任何回溯。

+0

用'active_vuln_type = [x [0] for x in cur]''替換'active_vuln_type = cur.fetchall()'? – Abdou

+0

我還沒有想過要在這個級別循環 - 大腦放屁的時刻!我會給它一個旋轉! – Luke

+0

這樣就可以正確地得到第一個結果,但它不會迭代並獲得結果的其餘部分 – Luke

回答

1

以下修復了兩個問題:1.將查詢輸出轉換爲可迭代的字符串,並使用print函數替換return語句,以便for-loop不會過早結束。

我也冒昧地刪除了一些冗餘內容,如關閉with聲明中的文件,並毫無意義地將list轉換爲list。我也在ExportList函數中調用GetActiveVulnSets。這應該不需要在函數定義之外調用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變量。在很多使用情況下,它們很難調試並且很不必要。

我希望這會有所幫助。

相關問題