首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下载带有事件的文件

下载带有事件的文件
EN

Stack Overflow用户
提问于 2017-10-17 00:58:21
回答 1查看 160关注 0票数 0

我想使用线程一次下载多个文件。

以下是我尝试过的:

代码语言:javascript
复制
import eventlet
from urllib.request import urlopen

def fetch(url, fl):
  urllib.request.urlretrieve(url, fl)
  return url, fl

pool = eventlet.GreenPool()
for url, fl in pool.imap(fetch, dlList, dlFList):
  print("downloaded " + url + " to " + fl)

其中dListurls的列表,dlFList是目标文件的列表。

但是,我得到了错误:

TypeError: fetch()缺少一个必需的位置参数:'fl‘

如何使用此pool.imap正确传递多个参数

EN

回答 1

Stack Overflow用户

发布于 2017-10-18 01:20:26

假设fetch函数是只读的(例如在其他库中),那么您必须对中间函数进行imap

代码语言:javascript
复制
pool.imap(lambda (u,f): fetch(u, f), zip(dlList, dlFList))

但是,由于您可以控制映射函数,所以将其更改为接受url和filename的元组。

代码语言:javascript
复制
def fetch(t):
  url, filename = t
  urllib.request.urlretrieve(url, filename)
  return t

pool.imap(fetch, zip(dlList, dlFList))

不想吃土豆吗?使文件名可从url中计算,例如,通过字典查找或字符串处理。

代码语言:javascript
复制
url_filename_map = dict(zip(dlList, dlFList))  # or build dict some other way

def fetch(url):
  filename = url_filename_map[url]
  # or
  filename = '/path/prefix/' + hashlib.md5(url).hexdigest()
  urllib.request.urlretrieve(url, filename)
  return url, filename

pool.imap(fetch, url_filename_map)  # same as imap(fetch, urlmap.keys())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46780981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档