如何在Python和MySQL中更优雅地进行查找?

时间:2012-06-05 16:02:06

标签: mysql cursor python fetchall

我在一个名为 nameid_cityid.txt 的目录中有一堆文件,nameid和cityid是名称(整数(10))和城市 mydata 表格中的(整数(10))。

虽然以下解决方案有效,但我正在进行类型转换,因为fetchall提取'L'和nameid的文件名元组,cityid是字符串,..

如果你能建议采用pythonic或更优雅的方式做同样的事情,那对我和社区来说都会很棒!

我想要实现的目标: 从目录中找不到数据库中的记录,然后对该文件执行某些操作,例如解析/移动/删除它。

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"

2 个答案:

答案 0 :(得分:1)

您可以在SQL中执行连接,这将返回一个字符串:

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

答案 1 :(得分:1)

我会使用一套快速简便的测试:

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测试。

最后,我将文件名拆分逻辑简化为一行。

现在,如果你想要的只是一组在数据库中尚未出现的文件名(而不是枚举哪些文件名是哪些,哪些不是),只需使用set操作:

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)删除数据库中已有行的所有文件名,只需一个简单的操作。