For循环Python中只运行一次
这里是我下面的代码:For循环Python中只运行一次
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.test
try:
cursor= db.alb.find()
cursor1=db.img.find()
cntr=db.alb.count()
print "looping starts..."
for im in cursor1:
id1=im['_id']
cnt=0
print id1
for image in cursor:
ig=image['images']
print "image value:" , ig
print "id value:" , id1
if (id1 == ig):
break;
else:
cnt=cnt+1
print "count value", cnt
if (cnt == cntr):
print "removing..."
db.img.remove({'_id':id1})
print id1
print cnt
except Exception as e:
print "unexpected error", type(e),e
我有以下ALB收集数据:
id:0 images:366
id:1 images:367
id:2 images:368
id:3 images:369
id:4 images:370
id:5 images:380
id:6 images:371
id:7 images:372
下面我有张图片收集:
id:365
id:345
id:372
id:370
id:371
id:380
id:381
基本上从上面的代码id:365
,id:345
,id:381
应该是re从img集合中移出,但是我的代码只删除了img集合中的id:365
。
请帮我在这段代码纠正错误.....
这将起作用。这删除列表中所有的id是由于一个generator
是,当你调用db.alb.find()
发电机值为提供的事实疲惫,当你在当你迭代它的循环,使第二次迭代它在它里面所以只有for循环没有价值只运行一次
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.test
try:
cursor1=db.img.find()
cntr=db.alb.count()
print "looping starts..."
for im in cursor1:
id1=im['_id']
cnt=0
print id1
cursor= db.alb.find() #move it here
for image in cursor:
ig=image['images']
print "image value:" , ig
print "id value:" , id1
if (id1 == ig):
break;
else:
cnt=cnt+1
print "count value", cnt
if (cnt == cntr):
print "removing..."
db.img.remove({'_id':id1})
print id1
print cnt
except Exception as e:
print "unexpected error", type(e),e
有这样做的更好的方法。例如,什么是这样的:
# Get all image identifiers
alb_images = [image['images'] for image in cursor]
# Find the ones to remove
images_to_remove = [im for im in cursor1 if im['_id'] not in alb_images]
以上后,images_to_remove
应该包含图像从您的img
集合中删除。
[注:这可能不是最有效的,也没有这样做的最Python的方式]
我认为,而不是alb_images我们可以使用cursor.values() –
其实我是新来的蟒蛇和对不起,我不明白你用过的代码行....但从看到我觉得它是一样的我写了...如果不是,请纠正我,如果我理解错了。 – Svati
@Svati你可能想阅读[list comprehension](http://www.python-course.eu/list_comprehension.php)。 –
我不知道哪里是你的代码失败。将调试语句写在正确的位置,以便您可以获取代码失败的位置。
例如
>>> for i in range(1,5):
... print "Debug 1- i: ", i
... for j in range(10,15):
... print "Debug 1.1- j ", j
... if j==13:
... break
- 在
cursor1
码打印长度(我认为计数法) - 后打印
cursor1
值REMOVE语句即db.img.remove({'_id':id1})
一个更您可以删除从IMG集合后全部过程db.img.remove({'_id':id1})
创建列表,它保存id1
值和过程后,只是你从db.img
remove_ids = []
# remove statement, append id value to list
remove_ids.append(id1)
# After process do
for id in remove_ids:
db.img.remove({'_id':id})
我在for循环之后使用print来查找它是否循环遍历每个文档 – Svati
在问题中添加打印输出。还有一种情况是,你可以在所有处理'db.img.remove({'_ id':id1})' –
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.rop
try:
cntcur=db.albums.aggregate([{"$unwind":"$images"},{"$group":{"_id":"null","count":{'$sum':1}}}])
cursor1=db.images.find()
for im in cursor1:
id1=int(im['_id'])
cnt=0
cursor= db.albums.aggregate([{"$unwind":"$images"}])
print id1
for image in cursor:
print "moving to images collection"
ig=image['images']
if (id1 == ig):
break;
else:
cnt=cnt+1
if (cnt == cntr):
print "removing"
db.images.remove({'_id':id1})
except Exception as e:
print "unexpected error", type(e),e
对于上面的代码我得到的字符串索引必须是整数。我得到行ig = image ['images']
你能否提供完整的追溯,并将其作为另一个问题提出,并删除这一个,它违背了SO政策:) – The6thSense
什么是数据类型'image' ?打印“调试数据类型的图像:”,类型(图片) –
我已经发布它作为另一个问题“字符串索引必须是在Python代码中的一个地方的整数” – Svati
什么是cursor1的长度?'len(cursor1)'并写入调试语句,比如'print'Debug 1 id1“,id1' –
try'db = client [”test“]' – The6thSense
我试过用len(cursor1)没有长度()。另外我们如何找到光标的长度......它将所有文档存储在正确的....? – Svati