For 循环 运行 仅在 python 中执行一次
For loop running only once in 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 collection 中有以下数据:
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
我在 img 中有以下 collection:
id:365
id:345
id:372
id:370
id:371
id:380
id:381
基本上从上面的代码 id:365
, id:345
, id:381
应该从 img collection 中删除,但是我的代码只删除 id:365
中img collection.
请帮助我更正此代码中的错误......
有更好的方法。例如,像这样的东西怎么样:
# 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
collection 中删除的图像。
[注意:这可能不是最有效也不是最符合 Python 风格的方法。]
我不知道你的代码哪里出错了。在正确的位置写入 调试语句 这样您就可以找到代码失败的地方。
例如
>>> 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
值,即 db.img.remove({'_id':id1})
还有一个你能在所有处理后从 img 中删除集合吗db.img.remove({'_id':id1})
创建保存 id1
值的列表,处理后只需从 db.img
中删除列表的所有 ID
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})
这会起作用。这是因为当您调用 db.alb.find()
时提供 generator
当您迭代它时生成器值已耗尽 在 for 循环中,所以当你第二次迭代它时,它没有任何价值,所以只有 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
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
对于上面的代码,我得到的字符串索引必须是 integer.I 得到行 ig=image['images']
下面是我的代码:
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 collection 中有以下数据:
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
我在 img 中有以下 collection:
id:365
id:345
id:372
id:370
id:371
id:380
id:381
基本上从上面的代码 id:365
, id:345
, id:381
应该从 img collection 中删除,但是我的代码只删除 id:365
中img collection.
请帮助我更正此代码中的错误......
有更好的方法。例如,像这样的东西怎么样:
# 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
collection 中删除的图像。
[注意:这可能不是最有效也不是最符合 Python 风格的方法。]
我不知道你的代码哪里出错了。在正确的位置写入 调试语句 这样您就可以找到代码失败的地方。
例如
>>> 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
值,即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})
这会起作用。这是因为当您调用 db.alb.find()
时提供 generator
当您迭代它时生成器值已耗尽 在 for 循环中,所以当你第二次迭代它时,它没有任何价值,所以只有 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
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
对于上面的代码,我得到的字符串索引必须是 integer.I 得到行 ig=image['images']