2

我在一个名为nameid_cityid.txt的目录中有一堆文件,nameid 和 cityid 是mydata表中 name (integer(10))和 city (integer(10))的id。

虽然以下解决方案有效,但我正在进行类型转换,因为 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"
4

2 回答 2

1

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

SELECT CONCAT(nameid, '_', cityid, '.txt') FROM mydata
于 2012-06-05T16:04:30.740 回答
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操作(使用-运算符)通过一个简单的操作删除数据库中已经存在行的所有文件名。

于 2012-06-05T16:19:30.067 回答