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