Смешное поведение с использованием urlretrieve на dict в Python - PullRequest
0 голосов
/ 18 июля 2011

Я написал некоторый код для загрузки некоторых файлов с URL-адресов, которые я вставил в текст, однако, когда я запускаю сценарий, все работает нормально, за исключением того, что в конце, когда он загружает файлы, он создает один файл создаетс одним из имен, затем я вижу, что файл становится все больше и больше, а затем он снова становится меньше.Этот файл (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 Ответ

2 голосов
/ 18 июля 2011

То, что вы хотите вместо циклов for, просто:

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

Вам не нужны вложенные циклы: вы получаете все комбинации URL-адресов с именем, а не только совпадающие пары URL-адресов иназвание.zip(names, urls) берет первый элемент каждого списка, затем второй из каждого списка и т. Д.

...