我有一個名爲'testfolder'的文件夾,其中包含兩個文件'Sigurdlogfile'和'2004ADlogfile'。每個文件都有一個名爲entries
的字符串列表。我需要在兩者上運行我的代碼,並使用glob
來執行此操作。我的代碼爲每個文件創建一個字典,並存儲使用正則表達式提取的數據,其中字典密鑰存儲在下面的commonterms
中。然後它將每個字典插入到一個mysql表中。它成功地完成了所有這些,但是我的第二個sql語句沒有插入它應該如何(每個文件)。循環不適用於SQL更新語句(mysqldb)
import glob
import re
files = glob.glob('/home/user/testfolder/*logfile*')
commonterms = (["freq", "\s?(\d+e?\d*)\s?"],
["tx", "#txpattern"],
["rx", "#rxpattern"], ...)
terms = [commonterms[i][0] for i in range(len(commonterms))]
patterns = [commonterms[i][1] for i in range(len(commonterms))]
def getTerms(entry):
for i in range(len(terms)):
term = re.search(patterns[i], entry)
if term:
term = term.groups()[0] if term.groups()[0] is not None else term.groups()[1]
else:
term = 'NULL'
d[terms[i]] += [term]
return d
for filename in files:
#code to create 'entries'
objkey = re.match(r'/home/user/testfolder/(.+?)logfile', filename).group(1)
d = {t: [] for t in terms}
for entry in entries:
d = getTerms(entry)
import MySQLdb
db = MySQLdb.connect(host='', user='', passwd='', db='')
cursor = db.cursor()
cols = d.keys()
vals = d.values()
for i in range(len(entries)):
lst = [item[i] for item in vals]
csv = "'{}'".format("','".join(lst))
sql1 = "INSERT INTO table (%s) VALUES (%s);" % (','.join(cols), csv.replace("'NULL'", "NULL"))
cursor.execute(sql1)
#now in my 2nd sql statement I need to update the table with data from an old table, which is where I have the problem...
sql2 = "UPDATE table, oldtable SET table.key1 = oldtable.key1,
table.key2 = oldtable.key2 WHERE oldtable.obj = %s;" % repr(objkey)
cursor.execute(sql2)
db.commit()
db.close()
的問題是,在第二個SQL語句,它最終只從objkey
S的一個插入數據到表中的所有列,但我需要它,這取決於插入不同的數據文件代碼當前正在運行。我無法弄清楚爲什麼這是因爲我已經在我的for filename in files
循環內定義了objkey
。我怎樣才能解決這個問題?
你的第二個查詢在'table'和'oldtable'之間沒有任何關係,所以它做了一個完整的交叉產品。 – Barmar
你應該學會做準備的陳述,而不是做字符串替換。 – Barmar
@Barmar你是什麼意思?它從舊錶中爲'Sigurdlogfile'插入正確的數據,但問題在於它也會從2004AD –