2012-06-05 60 views
2

我有一大堆的文件在與nameid_cityid.txt,名爲填充NameID目錄和MYDATA表cityid是名(整數(10))和城市的ID(整數(10))如何在Python和MySQL中更優雅地進行查找?

雖然下面的解決方案工作,我做的類型轉換,因爲使用fetchall取「L」和填充NameID的文件名元組,cityid是字符串,..

如果你能提出的Python的或更優雅的方式做同樣的事情,那對我和社區會很棒!

我想實現: 查找目錄沒有在數據庫中的記錄,然後做一些與該文件,如解析/移動/刪除這些文件。

MySQL表MYDATA:

nameid cityid 
15633 45632 
2354 76894 

的Python:

for pdffile in os.listdir(filepath): 
    cityid, nameid = pdffile.strip('.txt').split('_')[0], pdffile.strip('.txt').split('_')[1]  
    cursor.execute("select cityid, nameid from mydata") 
    alreadyparsed = cursor.fetchall() 
    targetvalues = ((str(cityid), str(nameid)) for cityid, nameid in alreadyparsed) 
    if (int(cityid), int(nameid)) in alreadyparsed: 
     print cityid, nameid, "Found" 
    else: 
     print cityid, nameid, "Not found" 

回答

1

我'使用一個集合[R快速和簡單的測試:

cursor.execute("select CONCAT(nameid, '_', cityid, '.txt') from mydata") 
present = set([r[0] for r in cursor]) 

for pdffile in os.listdir(filepath): 
    nameid, cityid = map(int, pdffile.rsplit('.', 1)[0].split('_')) 
    print nameid, cityid, 
    print "Found" if pdffile in present else "Not found" 

首先,我拉着名環路外的查詢;每次查詢同一組行時沒有意義。

其次,我會讓MySQL使用CONCAT爲我生成文件名,以便將信息收集到一個集合中。

第三,因爲我們現在有一組文件名,所以測試每個單獨的文件名是一個簡單的pdffile in present測試。

最後,我簡化了文件名拆分邏輯到一行。現在

,如果你想要的是一組文件名未在數據庫中尚未出現(而不是列舉哪些是,哪些不是),只需使用一組操作:

cursor.execute("select CONCAT(nameid, '_', cityid, '.txt') from mydata") 
present = set([r[0] for r in cursor]) 

for pdffile in (set(os.listdir(filepath)) - present): 
    nameid, cityid = map(int, pdffile.rsplit('.', 1)[0].split('_')) 
    print nameid, cityid, "Found" 

在這裏,我們使用.difference operation (with the - operator)通過一個簡單的操作刪除數據庫中已有行的所有文件名。

+0

我喜歡基於集合的方法。我甚至不需要做這個'nameid,cityid = map(int,pdffile.rsplit('。',1)[0] .split('_'))'',因爲我們已經有了所需的文件列表因爲現有的已經被減掉了)。謝謝! – ThinkCode

1

你可以在SQL進行級聯,這將返回一個字符串:

SELECT CONCAT(nameid, '_', cityid, '.txt') FROM mydata 
+0

並遍歷目錄中的每個文件,通過匹配.txt文件來查看錶中找不到哪一個文件?我試圖用最少的迭代次數來完成它。我會計時,看看哪一個花費更少的時間。謝謝! – ThinkCode

+0

@ThinkCode:對不起,您正在嘗試執行哪些操作 - 查找沒有數據庫記錄的文件,反之亦然? – eggyal

+0

查找數據庫中不存在的文件。 – ThinkCode

相關問題