【问题标题】:Funny behavior using urlretrieve on a dict in Python在 Python 中的 dict 上使用 urlretrieve 的有趣行为
【发布时间】:2011-07-18 06:58:58
【问题描述】:

我写了一些代码来从 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)

【问题讨论】:

  • 您的第一个循环将所有 dict 条目设置为最后一个 url。

标签: python dictionary python-3.x urllib


【解决方案1】:

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

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

您不希望嵌套循环:您将获得 URL 与名称的所有组合,而不仅仅是匹配的 URL 和名称对。 zip(names, urls) 获取每个列表的第一项,然后是每个列表的第二项,依此类推。

【讨论】:

  • 嗨,谢谢你的帮助,我改变了,但是当我尝试运行时,我得到 ValueError: read of closed file
  • pastebin.com/ViHRimjt 在 Python 2.7 上为我工作。如果您将 import urllib 行更改为 import urllib.request as urllib 我认为它将适用于 Python 3。
  • 好的,我正在运行 2.6.1 的修改版本,到目前为止一切顺利!
  • 好的,它现在可以工作了!我将所有 python 3 特定部分更改为 python 2.6,现在它可以工作了。
猜你喜欢
  • 2014-01-18
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多