在Python中的dict上使用urlretrieve的有趣行为

时间:2011-07-18 06:58:58

标签: python dictionary python-3.x urllib

我写了一些代码来从URL下载一些文件,我把它放在一个dict中,然而,当我运行脚本时,一切运行正常,除非最后下载文件,它创建创建一个文件使用其中一个名称,然后我看到该文件越来越大,然后它再次变小。这个文件(mp4)总是无法播放/损坏,而且只有一个,它永远不会移动到另一个。知道发生了什么事吗?我的猜测是,不知何故python不断将不同的文件下载到一个本地文件并覆盖,我不明白为什么。

以下是代码:

import sys
import os 
import re 
import urllib 
import urllib.request


urlfilebytes = urllib.request.urlopen('http://www.pbs.org/wgbh/nova/sciencenow/download/index.html')
urlfile = urlfilebytes.read().decode('utf-8')
urls = re.findall(r'(http://www-tc.pbs.org/wgbh/nova/sciencenow/media/downloads/\S+)"', urlfile)
print(urls)
names = re.findall(r'NSN_\S+.mp4', str(urls))
print(names)
names_to_urls = {}
for name in names:
  for url in urls:
    names_to_urls[name] = url
print(names_to_urls)
for key in names_to_urls.keys():
  for value in names_to_urls.values():
    urllib.request.urlretrieve(value, key)

1 个答案:

答案 0 :(得分:2)

你想要的而不是你的for循环只是:

for name, url in zip(names, urls):
    urllib.request.urlretrieve(url, name)

您不需要嵌套循环:您将获取URL与名称的所有组合,而不仅仅是匹配的URL和名称对。 zip(names, urls)获取每个列表的第一项,然后是每个列表中的第二项,等等。