2017-07-03 95 views
0

HEJ大家,While循环被忽略

剧本的想法是从我公司的网站目录页面抓取图像链接并将其更改为图像链接具有更高的分辨率和滤波器及图像格式,其中在链接本身中找到变量来过滤,在这种情况下是大写P.然后,通过链接生成一个csv。

csv的转换,过滤和写入工作正常,但我的问题是,我不想要所有的80个产品,我只想要8个在列表中nl

links列表包含这样一个https://rndr.mywebsite.com/media/catalog/product/seo-cache/x386/19/95/19-95-101P/How-Hard-You-Hit-Butcher-Billy-Premium-Poster.jpg

元素:变量比和素材(inputnumber-1)通过命令行输入定义。假设输入是ratio = Pcreatives = 9-1

NOTE2:为了更快速的测试,到目前为止,链接列表限制了15个元素。

nl= [] 
string1= "https://rndr.mywebsite.com/media/catalog/product/cache/x800/" 
string2= ".jpg" 

while len(nl) <= creatives:       
    for index in range(len(links)): 
     if "P" in "".join(links[index].split("/", 12)[10]) and "P" in ratio: 
      print("YEAH", len(nl)) 
      nl.extend([string1 + "/".join(links[index].split("/", 11)[8:11]) + string2]) 
     else: 
      print ("Ups", len(nl)) 
print (nl) 

实际产量

('YEAH', 0) 
('YEAH', 1) 
('YEAH', 2) 
('YEAH', 3) 
('Ups', 4) 
('YEAH', 4) 
('YEAH', 5) 
('Ups', 6) 
('YEAH', 6) 
('YEAH', 7) 
('YEAH', 8) 
('YEAH', 9) 
('YEAH', 10) 
('YEAH', 11) 
('YEAH', 12) 
[https://rndr.mywebsite.com/media/catalog/product/cache/x800/19/95/19-95-101P.jpg, transformed-link2,...,transformed-link12] 

正如你所看到的过滤和转化工作正常,但不必在列表nl 9个链接后,应立即停止。

+0

不一定,因为你在做循环。 –

+0

你正在用另一个列表扩展'nl',我不知道在另一个循环内有多大的尺寸。在下一次检查完成之前,您可能会超出限制。 –

回答

2

正如Coldspeed所述,在内部循环中,您将向nl添加一批物品,从而超出限制。为了解决这个问题,你可以摆脱while循环,做这个:

for index in range(len(links)): 
    if "P" in "".join(links[index].split("/", 12)[10]) and "P" in ratio: 
     print("YEAH", len(nl)) 
     nl.append(string1 + "/".join(links[index].split("/", 11)[8:11]) + string2) 
     if len(nl) > creatives: 
      break 
    else: 
     print ("Ups", len(nl)) 
+0

对不起,没有看到你已经发布。将你的答案与我的联系起来:) –

+0

好的,你的方式比我最初的想法更聪明。 感谢您的回答并修复我的代码:) –

1

添加了几个这样的打印报表,可以帮助你弄清楚到底是怎么回事:

while len(nl) <= creatives:  
    print('outer loop')     
    for index in range(len(links)): 
     print('inner loop') 
     ... 

你在这里有一个嵌套循环。会发生什么是,在内部循环内部,外部循环的条件不会被检查,直到内部循环完成迭代。你需要做的是在内部循环中放置一个明确的break

查看this answer寻求解决方案。 :)

+0

啊,谢谢你解释我在那里建造的东西。我已经摆弄了休息时间,但并没有意识到它检查病情的问题。 将看看你提供的链接:) –

+0

@NilsOle它链接到你已经接受的Błotosmętek的解决方案。我在这里的工作已经完成。 –

1

你正在做while循环内的for循环。 while循环只会在完成第一个for循环时检查其条件,此时您已经循环遍历links中的每个元素。

E.g.

i = 0 
while i < 10: 
    for z in range(20): 
     i = z 
     print(i) 

将一直打印到19,因为while循环的前提条件只有在内循环结束时才会被检查。

+0

非常感谢您解释我的错误是什么,并给出实际解释我的代码中发生了什么:) –