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
  1. 代码打印长度为cursor1(我认为是用计数法)
  2. 在删除语句后打印 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']